AWS Склеивает простое пользовательское преобразование с желаемыми именами выходных столбцов

#aws-glue

#aws-glue

Вопрос:

Предположим, у меня есть s3://mybucket/mydata/, содержащий csv-файлы со следующими столбцами:

цвет, форма, количество, стоимость

и типы:

строка, строка, двойная, двойная

В качестве надуманного примера предположим, что я хочу преобразовать данные и выгрузить их в s3://mybucket/mydata-transformed/, переведя строки в верхний регистр и добавив 2 к удвоениям. Таким образом, строка, скажем, red, circle, 2,21,7 будет преобразована в RED, CIRCLE, 4,23,7 в выходных данных. Следующий код вроде бы делает то, что я хочу (код котельной плиты опущен), где таблица «mydata» уже создана для исходной корзины:

 DataSource0 = glueContext.create_dynamic_frame.from_catalog(database = "my database", table_name = "mydata", transformation_ctx = "DataSource0")
ds_df = DataSource0.toDF()
ds_df.select("color","shape","quantity","cost").show()
ds_df1 = ds_df.select(upper(col('color')),upper(col('shape')),col('quantity') 2,col('cost') 2)
Transform0 = DynamicFrame.fromDF(ds_df1, glueContext, "Transform0")
DataSink0 = glueContext.write_dynamic_frame.from_options(frame = Transform0, connection_type = "s3", format = "json", connection_options = {"path": "s3://mybucket/mydata-transformed/", "partitionKeys": []}, transformation_ctx = "DataSink0")
job.commit()
  

Ниже приведен результирующий json для приведенного выше примера данных:

{«верхний (цвет)»: «КРАСНЫЙ», «верхний (форма)»: «КРУГ», «(количество 2)»: 4.0,»(стоимость 2)»: 23.7}

Данные были преобразованы правильно. Однако имена столбцов теперь «верхний (цвет)», «верхний (форма)», «(количество 2)», «(стоимость 2)». Как мне сделать так, чтобы результирующими именами столбцов были цвет, форма, количество, стоимость?

Ответ №1:

Для решения проблемы вы можете использовать alias . Проверьте полный пример ниже:

 import pyspark.sql.functions as f

jsonStr = """{  "color": "red", "shape": "square","quantity":4,"cost":"11.11" }"""
df = spark.read.json(sc.parallelize([jsonStr]))
df.show()

 ----- ----- -------- ------ 
|color| cost|quantity| shape|
 ----- ----- -------- ------ 
|  red|11.11|       4|square|
 ----- ----- -------- ------ 


ds_df1 = df.select(upper(col('color')).alias('color'),upper(col('shape')).alias('shape'),'quantity','cost')

ds_df1.show()

 ----- ------ -------- ----- 
|color| shape|quantity| cost|
 ----- ------ -------- ----- 
|  RED|SQUARE|       4|11.11|
 ----- ------ -------- -----