【问题标题】:How to query value using get_json_object()如何使用 get_json_object() 查询值
【发布时间】:2022-01-04 04:13:19
【问题描述】:

我需要提取命名空间为 GLOBALID 的属性的值,格式如下,例如在本例中,我需要提取“123456”

[{
        "namespace": "GLOBALID",
        "key": "ID",
        "value": "123456"
    },
    {
        "namespace": "RPS",
        "key": "ID",
        "value": "12xt12"
    }
]

但是,当我使用 select get_json_object(json_column, '$.GLOBALID.value') 时,它不会提取值(已编辑)

【问题讨论】:

    标签: json pyspark hive


    【解决方案1】:

    您需要将json 字符串解析为JSON 值,然后应用过滤。这是必需的,因为 Spark 不允许在 JSONPath 中使用过滤器表达式。

    
    from pyspark.sql import functions as F
    from pyspark.sql.types import ArrayType, StringType, StructType, StructField
    
    df = spark.createDataFrame([('[{"namespace":"GLOBALID","key":"ID","value":"123456"},{"namespace":"RPS","key":"ID","value":"12xt12"}]', ), ], ("json_column", ))
    
    
    json_schema = ArrayType(StructType([StructField('namespace', StringType(),), \
                                        StructField('value', StringType(),)]))
    
    df.select(F.explode(F.from_json("json_column", json_schema)).alias("json"))\
      .filter(F.col("json")["namespace"] == "GLOBALID")\
      .select("json.value")\
      .show()
    

    输出

    +------+
    | value|
    +------+
    |123456|
    +------+
    

    【讨论】:

    • 我不能在我用于 ETL 的工具中使用 python 代码或数据框,只允许使用 spark 函数
    • F.from_jsonfilter 都是 spark 函数。你的意思是说你的 JSON 是一个字符串吗?
    【解决方案2】:

    对于 pyspark,创建数据框和过滤器。

    json = [
        {
            "namespace": "GLOBALID",
            "key": "ID",
            "value": "123456"
        },
        {
            "namespace": "RPS",
            "key": "ID",
            "value": "12xt12"
        }
    ]
    
    df = spark.createDataFrame(json)
    df.show()
    
    # +---+---------+------+
    # |key|namespace| value|
    # +---+---------+------+
    # | ID| GLOBALID|123456|
    # | ID|      RPS|12xt12|
    # +---+---------+------+
    
    df.filter("namespace = 'GLOBALID'").select('value').rdd.map(lambda x: x[0]).collect()
    # ['123456']
    

    【讨论】:

    • 我不能在我用于ETL的工具中使用python代码或数据框,只允许使用spark函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多