【问题标题】:Adding column to dataFrame将列添加到数据框
【发布时间】:2022-01-03 02:04:59
【问题描述】:

我需要根据来自其他列的 json 数据向 DataFrame (DynamicFrame) 添加新列,最好的方法是什么?

架构:

'id' 'name' 'customJson'
--------------------------
1 ,John, {'key':'lastName','value':'Smith'}

之后:

'id' 'name' 'lastName' 'customJson'
-----------------------------------
1, John, Smith, {'key':'lastName','value':'Smith'}

尝试使用 withColumn 但不确定如何根据 json 值获取和计算数据

【问题讨论】:

    标签: pyspark aws-glue aws-glue-spark


    【解决方案1】:

    DynamicFrames 不允许您进行这种级别的转换,因此您需要使用 .toDF() 方法将其转换为 PySpark DataFrame,然后在转换后,.fromDF()

    这是一个关于如何使用 PySpark DataFrame 解析它的示例:

    以创建 DataFrame 为例

    from pyspark.sql import DataFrame , SparkSession
    spark = spark = SparkSession.builder \
        .master("local") \
        .appName("Parsing JSON") \
        .getOrCreate()
    
    df = spark.createDataFrame([(1 ,"John", "{'key':'lastName','value':'Smith'}")],['id','name','customJson'])
    
    

    现在解析 JSON 列

    from pyspark.sql.types import StructType, StructField, StringType
    from pyspark.sql.functions import from_json
    schema = StructType([StructField('key', StringType()),StructField('value', StringType())])
     
    df = df.select(
        df.id,
        df.name,
        from_json(df.customJson, schema).value.alias('lastName'),
        df.customJson
    )
    

    如果您愿意,请随时运行this notebook

    这里有一些文档: https://spark.apache.org/docs/3.2.0/api/python/reference/api/pyspark.sql.functions.from_json.html

    [编辑]

    如果您的 Json 表示一个元素数组(如下面的评论中所示),您需要在架构中包含 ArrayType,然后使用 explode 函数来展平您需要的值。

    以创建DataFrame为例

    
    from pyspark.sql import DataFrame , SparkSession
    spark = spark = SparkSession.builder \
        .master("local") \
        .appName("Word Count") \
        .getOrCreate()
    
    df = spark.createDataFrame([(1 ,"John", "[{'key':'lastName','value':'Smith'},{'key':'lastName','value':'Silva'}]")],['id','name','customJson'])
    
    

    解析表示元素数组的Json

    from pyspark.sql.types import StructType, StructField, StringType, ArrayType
    from pyspark.sql.functions import from_json, explode
    schema = ArrayType(StructType([StructField('key', StringType()),StructField('value', StringType())]))
     
    df = df.select(
        df.id,
        df.name,
        explode(
            from_json(df.customJson, schema)
        ).alias('parsedJson'),
        df.customJson
    )
    
    df.select(
        df.id,
        df.name,
        df.parsedJson.value.alias("lastName"),
    ).toPandas().to_markdown() 
    
    # to_markdown properly formats the DataFrame as markdown to print below as table
    
    id name lastName
    0 1 John Smith
    1 1 John Silva

    【讨论】:

    • 谢谢!如果我有键值数组,是否可以提取列,例如 "[{'key':'name', 'value':'John'},{'key':'name', 'value':'杰克'}]"
    • 哇,很好,这是一些功夫魔术 :),我还有一个问题是可以将列名设置为“键”值,所以如果我有多个键值,例如名称, lastName 我会得到列'name'和列'lastName',那应该是列名可以像值一样计算吗?
    猜你喜欢
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2020-08-02
    相关资源
    最近更新 更多