Как можно исключить разделы при преобразовании CSV в ORC с помощью AWS Glue? - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть куча CSV-файлов в S3, которые я пытаюсь преобразовать в ORC, используя задание ETL в AWS Glue. У меня есть сканер, который сканирует каталог, содержащий CSV и создает таблицу. Таблица выглядит так:

Column name | Data type | Partition key
---------------------------------------
field1      | string    |
field2      | string    |
field3      | string    |
partition_0 | string    | Partition (0)
partition_1 | string    | Partition (1)

Далее я пытаюсь преобразовать файлы CSV в файлы ORC. Вот сценарий ETL, аналогичный тому, который я использую:

args = getResolvedOptions(sys.argv, ['JOB_NAME', 'database', 'table_name', 'output_dir'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)
partition_predicate = '(partition_0 = "val1") AND (partition_1 = "val2")'
datasource0 = glueContext.create_dynamic_frame.from_catalog(database = args['database'], table_name = args['table_name'], push_down_predicate = partition_predicate, transformation_ctx = "datasource0")
final = glueContext.write_dynamic_frame.from_options(frame = datasource0, connection_type = "s3", connection_options = { "path": args['output_dir'] }, format = "orc")
job.commit()

У меня есть другой сканер, который сканирует мой выходной каталог, содержащий файлы ORC. Когда он генерирует таблицу, он выглядит так:

Column name | Data type | Partition key
---------------------------------------
field1      | string    |
field2      | string    |
field3      | string    |
partition_0 | string    |
partition_1 | string    |
partition_0 | string    | Partition (0)
partition_1 | string    | Partition (1)

Похоже, он рассматривает разделы как поля в файле ORC (чего не должно быть). Как я могу изменить свой сценарий, чтобы преобразование CSV в ORC не включало ключи раздела в виде столбцов схемы?

1 Ответ

0 голосов
/ 13 сентября 2018

Если вам нужно сохранить разбиение, добавьте параметр partitionKeys в модуль записи:

final = glueContext.write_dynamic_frame.from_options(frame = datasource0, connection_type = "s3", connection_options = { "path": args['output_dir'], "partitionKeys" -> Seq("partition_0", "partition_1") }, format = "orc")

В противном случае просто удалите столбцы разбиения:

cleanDyf = datasource0.dropFields(Seq("partition_0", "partition_1"))
final = glueContext.write_dynamic_frame.from_options(frame = cleanDyf, connection_type = "s3", connection_options = { "path": args['output_dir'] }, format = "orc")
...