从 AWS Glue DynamicFrame 中的数组<string> 中提取第一个值
Posted
技术标签:
【中文标题】从 AWS Glue DynamicFrame 中的数组<string> 中提取第一个值【英文标题】:Extract first value from array<string> in AWS Glue DynamicFrame 【发布时间】:2020-04-15 18:58:54 【问题描述】:我在 S3 中的 Json 结构如下。我已成功将其抓取到 Data Catalog 表中并将其导入 DynamicFrame。
"ColumnA": "Value",
"ColumnB": [
"Value"
],
"ColumnC": "Value",
"ColumnD": "Value"
DynamicFrame 的架构
root
|-- columnA: string
|-- columnB: array
| |-- element: string
|-- columnC: string
|-- columnD: string
虽然columnB是数组类型,但里面只有1个值。我无法控制生成这些 JSON 文件的源,所以我必须使用这种格式。
我需要将此推送到具有以下架构的 Redshift 表。
+--------+-------+-------+-------+
| ColumnA|ColumnB|ColumnC|ColumnD|
+--------+-------+-------+-------+
虽然 A/C/D 列相当简单,但如何从 DynamicFrame 中的“ColumnB”数组中提取第一个值以便能够写入 Redshift 表?
【问题讨论】:
【参考方案1】: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|
#+-------+-------+-------+-------+
【讨论】:
谢谢!当 JSON 中根本不存在“ColumnB”时(生成 JSON 的源会在 B 为空时删除列 B),此解决方案是否会起作用? @AzeemShaikh,您可以在读取 json 文件时提供structtype
架构,然后 spark 将始终添加 columnB
列!以上是关于从 AWS Glue DynamicFrame 中的数组<string> 中提取第一个值的主要内容,如果未能解决你的问题,请参考以下文章
AWS Glue - GlueContext:从 S3 读取分区数据,将分区添加为 DynamicFrame 的列
使用 JDBC 写入编写 AWS Glue DynamicFrame 时出现 PostreSQL 枚举问题
可以将哪些选项传递给 AWS Glue DynamicFrame.toDF()?