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

Spark-将包含JSON字符串的coulmn从StringType转换为ArrayType(StringType())

郭永安
2023-03-14

我有一个包含json字符串的数据框架df,如下所示,

'''[{"@id":"Party_1","@ObjectID":"Policy_1"},{"@id":"Party_2","@ObjectID":"Policy_2"},{"@id":"Party_3","@ObjectID":"Policy_3"}]'''

df 架构:

root
 |-- col1: string (nullable = true)

如何将其转换为字符串数组(数组类型(字符串类型())?

结果应该是这样的,

['{"@id":"Party_1","@OriginatingObjectID":"Policy_1"}',
 '{"@id":"Party_2","@OriginatingObjectID":"Policy_2"}',
 '{"@id":"Party_3","@OriginatingObjectID":"Policy_3"}']

结果模式:

root
 |-- arr_col: array (nullable = true)
 |          |-- element: string (containsNull = true)

任何帮助都将不胜感激。谢谢你!

共有1个答案

程亦
2023-03-14

您可以使用from_json函数获取json字段,只需对值进行轻微修改,如下所示

data = [
    ('[{"@id":"Party_1","@ObjectID":"Policy_1"},{"@id":"Party_2","@ObjectID":"Policy_2"},{"@id":"Party_3","@ObjectID":"Policy_3"}]', 2767),
    ('[{"@id":"Party_1","@ObjectID":"Policy_1"},{"@id":"Party_2","@ObjectID":"Policy_2"},{"@id":"Party_3","@ObjectID":"Policy_3"}]', 4235)
]

df = spark.createDataFrame(data).toDF(*["value", "count"])\
    .withColumn("value", f.regexp_replace(f.col("value"), "\\[\\{", "{\"arr\": [{"))\
    .withColumn("value", f.regexp_replace(f.col("value"), "\\}\\]", "}]}"))


json_schema = spark.read.json(df.rdd.map(lambda row: row.value)).schema
resultDF = df.select(f.from_json("value", 
schema=json_schema).alias("array_col"))\
    .select("array_col.*")

resultDF.printSchema()
resultDF.show(truncate=False)

或者,如果您希望嵌套json作为字符串,您可以使用自定义模式。

输出架构:

root
 |-- arr: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- @ObjectID: string (nullable = true)
 |    |    |-- @id: string (nullable = true)

输出:

+---------------------------------------------------------------+
|arr                                                            |
+---------------------------------------------------------------+
|[{Policy_1, Party_1}, {Policy_2, Party_2}, {Policy_3, Party_3}]|
|[{Policy_1, Party_1}, {Policy_2, Party_2}, {Policy_3, Party_3}]|
+---------------------------------------------------------------+
 类似资料:
  • 是否可以将StringType列强制转换为spark dataframe中的ArrayType列? A:数组(nullable=true)

  • 我试图在我的数据集上运行PySpark中的FPGrowth算法。 我得到以下错误: 我的数据帧df格式如下: 如果“名称”列中的数据形式为: 如何在这个形式中从StringType转换为ArrayType 我从我的RDD形成了Dataframe:

  • 我有一个字符串返回给我,其中包含转义字符。 这是一个示例字符串 " test\40gmail.com " 如您所见,它包含转义字符。我需要将其转换为其实际值,即 " test@gmail.com " 我该怎么做?

  • 我有一个具有如下架构的数据帧 我已经有了上面的结果。 我想使用火花scala转换如下架构 请帮忙

  • 问题内容: 我从HTML页面中将一个字符串输入到Java HTTPServlet中。根据我的要求,我得到了显示汉字的ASCII码: “可以告诉我” (无空格) 如何将该字符串转换为Unicode? HTML代码: Java代码: 如果我打印问题[0],则会得到以下值:“可以告&#3578

  • 我有一个RestController类,它有一个方法可以根据电影的标题搜索电影: 如果我发送一个json字符串 从邮递员到endpoint,我收到一个空白的回复。 然后我做了一个 就在进入方法后找到字符串filmSearch正是我从邮递员发送的JSON字符串。我的应用程序没有看到JSON和提取值从filmSearch在我的请求附加到应用程序内字符串filmSearch. 如果我移除 在请求映射的一