【问题标题】:Extract first value from array<string> in AWS Glue DynamicFrame从 AWS Glue DynamicFrame 中的数组<string> 中提取第一个值
【发布时间】: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 表?

【问题讨论】:

    标签: amazon-web-services pyspark aws-glue


    【解决方案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 &lt; 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 列!
    猜你喜欢
    • 2021-12-09
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多