Извлечь первое значение из массива <string>в AWS Glue DynamicFrame - PullRequest
2 голосов
/ 15 апреля 2020

Моя Json структура в S3, как показано ниже. Я успешно просканировал ее в таблицы каталога данных и импортировал ее в DynamicFrame.

{
    "ColumnA": "Value",
    "ColumnB": [
        "Value"
    ],
    "ColumnC": "Value",
    "ColumnD": "Value"
}

Схема DynamicFrame

root
|-- columnA: string
|-- columnB: array
|    |-- element: string
|-- columnC: string
|-- columnD: string

Хотя columnB является типом массива есть только 1 значение У меня нет контроля над источником, который генерирует эти JSON файлы, поэтому мне нужно работать с этим форматом.

Мне нужно передать sh это в таблицу Redshift, которая имеет схему ниже.

+--------+-------+-------+-------+
| ColumnA|ColumnB|ColumnC|ColumnD|
+--------+-------+-------+-------+

Хотя столбцы A / C / D довольно просты, как извлечь первое значение из массива 'ColumnB' в DynamicFrame , чтобы иметь возможность записи в таблицу Redshift?

1 Ответ

2 голосов
/ 15 апреля 2020

From Spark-2.4+:

Используйте функцию element_at для получения первого значения из массива

Example:

df=spark.createDataFrame([("value",["value"],"value","value")],["ColumnA","ColumnB","ColumnC","ColumnD"])
df.printSchema()
#root
# |-- ColumnA: string (nullable = true)
# |-- ColumnB: array (nullable = true)
# |    |-- element: string (containsNull = true)
# |-- ColumnC: string (nullable = true)
# |-- ColumnD: string (nullable = true)

from pyspark.sql.functions import *

df.withColumn("ColumnB",element_at(col("ColumnB"),1)).show()
#+-------+-------+-------+-------+
#|ColumnA|ColumnB|ColumnC|ColumnD|
#+-------+-------+-------+-------+
#|  value|  value|  value|  value|
#+-------+-------+-------+-------+

For spark < 2.4:

#Using .getItem(0)

df.withColumn("ColumnB",col("ColumnB").getItem(0)).show()
#+-------+-------+-------+-------+
#|ColumnA|ColumnB|ColumnC|ColumnD|
#+-------+-------+-------+-------+
#|  value|  value|  value|  value|
#+-------+-------+-------+-------+

#using index
df.withColumn("ColumnB",col("ColumnB")[0]).show()
#+-------+-------+-------+-------+
#|ColumnA|ColumnB|ColumnC|ColumnD|
#+-------+-------+-------+-------+
#|  value|  value|  value|  value|
#+-------+-------+-------+-------+
...