当前位置: 首页 > 知识库问答 >
问题:

Spark:如何解析嵌套列表的JSON字符串到spark数据帧?

焦兴为
2023-03-14

如何解析嵌套列表的JSON字符串以在pyspark中触发数据帧?

输入数据帧:

+-------------+-----------------------------------------------+
|url          |json                                           |
+-------------+-----------------------------------------------+
|https://url.a|[[1572393600000, 1.000],[1572480000000, 1.007]]|
|https://url.b|[[1572825600000, 1.002],[1572912000000, 1.000]]|
+-------------+-----------------------------------------------+

root
 |-- url: string (nullable = true)
 |-- json: string (nullable = true)

预期产出:

+---------------------------------------+
|col_1 | col_2               | col_3    |
+---------------------------------------+
| a    | 1572393600000       |  1.000   | 
| a    | 1572480000000       |  1.007   |
| b    | 1572825600000       |  1.002   |
| b    | 1572912000000       |  1.000   |
+---------------------------------------+

示例代码:

import pyspark
import pyspark.sql.functions as F

spark = (pyspark.sql.SparkSession.builder.appName("Downloader_standalone")
    .master('local[*]')
    .getOrCreate())

sc = spark.sparkContext
from pyspark.sql import Row

rdd_list  = [('https://url.a','[[1572393600000, 1.000],[1572480000000, 1.007]]'),
             ('https://url.b','[[1572825600000, 1.002],[1572912000000, 1.000]]')]

jsons = sc.parallelize(rdd_list) 

df = spark.createDataFrame(jsons, "url string, json string")
df.show(truncate=False)
df.printSchema()


(df.withColumn('json', F.from_json(F.col('json'),"array<string,string>"))
.select(F.explode('json').alias('col_1', 'col_2', 'col_3')).show())

有几个例子,但我不知道如何做到这一点:

> < li>

如何在pyspark中解析和转换spark数据帧行中的json字符串

如何从pyspark中的spark数据帧行转换具有多个键的JSON字符串?

共有2个答案

华泽语
2023-03-14
df.select(df.url, F.explode(F.from_json(df.json,"array<string>")))
.select("url",F.from_json((F.col("col")),"array<string>").alias("col"))
.select("url",F.col("col").getItem(0),F.col("col").getItem(1))
.show(truncate=False)

+-------------+-------------+------+
|url          |col[0]       |col[1]|
+-------------+-------------+------+
|https://url.a|1572393600000|1.0   |
|https://url.a|1572480000000|1.007 |
|https://url.b|1572825600000|1.002 |
|https://url.b|1572912000000|1.0   |
+-------------+-------------+------+
沈子昂
2023-03-14

通过字符串中的一些替换和拆分,您可以获得所需的结果:

from pyspark.sql import functions as F

df1 = df.withColumn(
    "col_1",
    F.regexp_replace("url", "https://url.", "")
).withColumn(
    "col_2_3",
    F.explode(
        F.expr("""transform(
            split(trim(both '][' from json), '\\\],\\\['), 
            x -> struct(split(x, ',')[0] as col_2, split(x, ',')[1] as col_3)
        )""")
    )
).selectExpr("col_1", "col_2_3.*")

df1.show(truncate=False)

#+-----+-------------+------+
#|col_1|col_2        |col_3 |
#+-----+-------------+------+
#|a    |1572393600000| 1.000|
#|a    |1572480000000| 1.007|
#|b    |1572825600000| 1.002|
#|b    |1572912000000| 1.000|
#+-----+-------------+------+

解释:

>

  • trim(json中的“][”):删除尾随字符和前导字符[],获得以下内容:1572393600000,1.000],[15724800000,1.007

    现在可以按]拆分,[\\\用于转义括号)

    变换从拆分中获取数组,对于每个元素,它通过逗号拆分并创建结构col_2col_3

    分解从变换中获得的结构数组,并星形扩展结构列

  •  类似资料:
    • 问题内容: 假设我有一个表示某些嵌套列表的字符串,我想将其转换为真实的东西。我认为可以做到这一点: 但是在用户可能提供字符串来执行的环境中,这可能是/将不是一个好主意。是否有人对完成相同任务的整洁解析器有任何想法? 问题答案: import ast >>> mylist = ast.literal_eval(“[‘foo’, [‘cat’, [‘ant’, ‘bee’], ‘dog’], ‘bar

    • 我需要将该模式格式提取到如下所示的治疗区域行项目:

    • 问题内容: 在我们的应用程序中,我们使用Spark sql获取字段值作为列。我正在尝试弄清楚如何将列值放入嵌套的json对象并推送到Elasticsearch。还有一种方法可以参数化值以传递给正则表达式? 我们目前正在使用Spark Java API。 实际输出: 我们需要在节点“ txn_summary”下的上述列,例如以下json: 预期产量: 问题答案: 将所有列添加到顶层结构应提供预期的输

    • 我正在从Spark读取一个dynamodb表,这个表在一个字段中有一个JSON字符串,在其他字段中有字符串。我能够读取JSON字段,但不能读取嵌套的JSON字段。这不是使用dataframes的查询Json列的副本。这个问题解释了如何从JSON字符串中提取列,但没有解释嵌套的JSON列。 users.show(1) 示例数据集 我需要从col1(JSON结构)和ID字段中提取几个字段。我能够理解如

    • 问题内容: 此JSON输出来自MongoDB聚合查询。我本质上需要将嵌套数据JSON解析为以下’ 和值。 我尝试了5种不同的技术来从中获得所需的信息,但是使用和模块却遇到了问题。 理想情况下,输出将是这样的: 问题答案: 注意:来自MongoDB的JSON响应实际上无效。JSON需要双引号(),而不是单引号()。 我不确定为什么您的响应中有单引号而不是双引号,但是从其外观上,您可以替换它们,然后只

    • 我有一个json文件。 我需要将它转换为String的ArrayList。如何使用Jackson库? UPD2: