AWS: Другая функция, кроме КОПИРОВАНИЯ, путем передачи данных из S3 в Redshift с помощью amazon-data-pipeline

Я пытаюсь перенести данные из Amazon S3-Cloud в Amazon-Redshift с помощью инструмента Amazon-Data-Pipeline.

Возможно ли при передаче данных изменить данные с помощью e.G. оператор SQL, чтобы в Redshift вводились только результаты оператора SQL?

Я нашел только команду копирования, например:

  {
    "id": "S3Input",
    "type": "S3DataNode",
    "schedule": {
    "ref": "MySchedule"
  },
  "filePath": "s3://example-bucket/source/inputfile.csv"
},

Источник: https://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-get-started-copy-data-cli.html


person dba    schedule 14.08.2014    source источник


Ответы (3)


Да, это возможно. К этому есть два подхода:

  1. Используйте transformSQL из RedShiftCopyActivity.

transformSQL полезно, если преобразования выполняются в рамках записи, которая загружается своевременно, например каждый день или час. Таким образом, изменения применяются только к партии, а не ко всей таблице.

Вот выдержка из документации:

transformSql: выражение SQL SELECT, используемое для преобразования входных данных. Когда вы копируете данные из DynamoDB или Amazon S3, AWS Data Pipeline создает таблицу, называемую промежуточной, и изначально загружает ее туда. Данные из этой таблицы используются для обновления целевой таблицы. Если указан параметр transformSql, из указанного оператора SQL создается вторая промежуточная таблица. Данные из этой второй промежуточной таблицы затем обновляются в окончательной целевой таблице. Таким образом, transformSql необходимо запустить в таблице с именем staging, а схема вывода transformSql должна соответствовать схеме конечной целевой таблицы.

Пожалуйста, найдите ниже пример использования transformSql. Обратите внимание, что выберите из staging таблицы. Он будет эффективно работать CREATE TEMPORARY TABLE staging2 AS SELECT <...> FROM staging;. Кроме того, все поля должны быть включены и соответствовать существующей таблице в RedShift DB.

{
  "id": "LoadUsersRedshiftCopyActivity",
  "name": "Load Users",
  "insertMode": "OVERWRITE_EXISTING",
  "transformSql": "SELECT u.id, u.email, u.first_name, u.last_name, u.admin, u.guest, CONVERT_TIMEZONE('US/Pacific', cs.created_at_pst) AS created_at_pst, CONVERT_TIMEZONE('US/Pacific', cs.updated_at_pst) AS updated_at_pst FROM staging u;",
  "type": "RedshiftCopyActivity",
  "runsOn": {
    "ref": "OregonEc2Resource"
  },
  "schedule": {
    "ref": "HourlySchedule"
  },
  "input": {
    "ref": "OregonUsersS3DataNode"
  },
  "output": {
    "ref": "OregonUsersDashboardRedshiftDatabase"
  },
  "onSuccess": {
    "ref": "LoadUsersSuccessSnsAlarm"
  },
  "onFail": {
    "ref": "LoadUsersFailureSnsAlarm"
  },
  "dependsOn": {
    "ref": "BewteenRegionsCopyActivity"
  }
}
  1. Используйте script из SqlActivity.

SqlActivity позволяет выполнять операции со всем набором данных и может быть запланирован для запуска после определенных событий с помощью механизма dependsOn.

{
  "name": "Add location ID",
  "id": "AddCardpoolLocationSqlActivity",
  "type": "SqlActivity",
  "script": "INSERT INTO locations (id) SELECT 100000 WHERE NOT EXISTS (SELECT * FROM locations WHERE id = 100000);",
  "database": {
    "ref": "DashboardRedshiftDatabase"
  },
  "schedule": {
    "ref": "HourlySchedule"
  },
  "output": {
    "ref": "LocationsDashboardRedshiftDatabase"
  },
  "runsOn": {
    "ref": "OregonEc2Resource"
  },
  "dependsOn": {
    "ref": "LoadLocationsRedshiftCopyActivity"
  }
}
person Vadym Tyemirov    schedule 18.11.2014

В RedshiftCopyActivity есть необязательное поле, называемое transformSql.

http://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-object-redshiftcopyactivity.html

Я лично не использовал это, но, судя по всему, кажется, что вы будете обрабатывать свои данные s3, находящиеся в таблице temp, и этот sql stmt вернет преобразованные данные для красного смещения для вставки.

Итак, вам нужно будет перечислить все поля в списке выбора, независимо от того, преобразовываете ли вы это поле.

person user1452132    schedule 15.08.2014

AWS Datapipeline SqlActivity

{
  "id" : "MySqlActivity",
  "type" : "SqlActivity",
  "database" : { "ref": "MyDatabase" },
  "script" : "insert into AnalyticsTable (select (cast(requestEndTime as bigint) - cast(requestBeginTime as bigint)) as requestTime, hostname from StructuredLogs where hostname LIKE '%.domain.sfx');",
  "schedule" : { "ref": "Hour" },
  "queue" : "priority"
}

Так что в основном в "скрипте" любой sql-скрипт / трансформации / команды SQL-команды Amazon Redshift

transformSql подходит, но поддерживает только выражение SQL SELECT, используемое для преобразования входных данных. ref: RedshiftCopyActivity

person n1tk    schedule 05.02.2016