【问题标题】:PySpark dataframe transformation - to get value part from JSONPySpark 数据框转换 - 从 JSON 中获取值部分
【发布时间】:2022-01-22 22:51:03
【问题描述】:

我有一个如下所示的数据框,其中包含键和值对。

| Name |  Age | Location
| abc  |  12  | loc1
| def  |  13  | loc2

我想用它创建一个 json 字符串。当我执行.toJSON() 并收集时,我会从该数据帧中获取以下 json 字符串

[{"name":"abc","age":12,"location":"loc1"},{"name":"def","age":13,"location":"loc2"}]

是否可以只获取 json 的值部分而不是获取如下所示的键?

预期输出:

[{"abc",12,"loc1"},{"def",13,"loc2"}]

我用来将数据帧转换为 json 的代码

df.toJSON().collect()

如果我们能在 PYSPARK 中得到一些解决方案,那就太好了。

【问题讨论】:

    标签: json apache-spark pyspark apache-spark-sql spark-structured-streaming


    【解决方案1】:

    您期望的结果不是有效的 JSON,因此您不能在数据帧上使用 toJSON()to_json 函数。

    您可以尝试使用format_string 函数来获得您想要的结构:

    from pyspark.sql import functions as F
    
    result = df.groupBy().agg(
        F.collect_list(
            F.format_string('{"%s", %s, "%s"}', *df.columns)
        ).alias("records")
    ).first()["records"]
    
    print(result)
    # ['{"abc", 12, "loc1"}', '{"def", 13, "loc2"}']
    

    【讨论】:

    • 感谢您的回答。如果我们有一个合适的 json,如下所示 - [[def,13,14],[12,13,14]]。我们如何在 pyspark 中做到这一点?
    • @act_coder 仍然不是正确的 json,您可以使用一些 json lint 自行检查。但是要获取数组数组,您可以在上面的代码中将部分F.format_string('{"%s", %s, "%s"}', *df.columns) 更改为F.array(*df.columns)
    • 当我使用 F.array 函数转换为 array[array] - 我无法保留数据类型。一切都带有这样的单引号 - [['abc','12','loc1'],['abc','12','loc1']]。当我们转换为数组时,是否也可以保留数据类型?
    • @act_coder 否,所有数组元素必须具有相同的类型。你不能有整数和字符串,这就是为什么所有东西都被 spark 转换为字符串的原因。
    猜你喜欢
    • 2021-06-19
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2021-12-12
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    相关资源
    最近更新 更多