AWS Glue - pySpark: разбиение строкового столбца на новый столбец целочисленного массива - PullRequest
2 голосов
/ 20 апреля 2020

Я пытаюсь выполнить работу ETL на AWS, используя Glue и pySpark, но, к сожалению, я действительно новичок в этом.

По большей части у меня нет проблем с работой с клеевой динамикой c dataframe для выполнения applymapping и некоторых других преобразований, которые я должен выполнить. Но я столкнулся с проблемой с конкретным столбцом, который я должен преобразовать из строки в массив целых чисел. В этом столбце, value, мы установили тип данных как строку, которая влияет на массив целых чисел, преобразованных в строку и разделенных пробелом, например запись данных в столбце value выглядит как '111 222 333 444 555 666'. Я должен преобразовать этот столбец в целочисленный массив, чтобы мои данные были преобразованы в '[111, 222, 333, 444, 555, 666]'.

Как мне добиться этого в AWS Glue и использовании pySpark? Любая помощь очень ценится.

1 Ответ

1 голос
/ 20 апреля 2020

Разделите столбец value на space с помощью функции split и приведите к array<int>.

  • (или) с помощью использование функции transform (From Spark-2.4) и приведение элементов массива к типу int.

Example:

df=spark.createDataFrame([('111 222 333 444 555 666',)],["value"])
df.printSchema()
#root
# |-- value: string (nullable = true)

#using split and cast as array<int>  
df.withColumn("array_int",split(col("value"),"\\s+").cast("array<int>")).\
    show(10,False)

#using transform function
df.withColumn("array_int",expr("""transform(split(value,"\\\s+"), x -> int(x))""")).\
show(10,False)
#+-----------------------+------------------------------+
#|value                  |array_int                     |
#+-----------------------+------------------------------+
#|111 222 333 444 555 666|[111, 222, 333, 444, 555, 666]|
#+-----------------------+------------------------------+

df.withColumn("array_int",split(col("value"),"\\s+").cast("array<int>")).printSchema()
df.withColumn("array_int",expr("""transform(split(value,"\\\s+"), x -> int(x))""")).printSchema()    
#root
# |-- value: string (nullable = true)
# |-- array_int: array (nullable = true)
# |    |-- element: integer (containsNull = true)
...