You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark使用from_json转换字符串时如何获取完整目标数组?

解决方法

你的原始字符串不是标准JSON格式:既不是单个JSON对象,也不是JSON数组,还使用了JSON不允许的单引号,这是解析不全的核心原因。按以下步骤处理即可实现需求:

  1. 预处理字符串,转为合法JSON数组
    把原始的{'text':'abc'},{'text':'def'}转换成标准JSON数组格式[{"text":"abc"},{"text":"def"}],用regexp_replace替换单引号、用concat给字符串前后加数组包裹符:

    from pyspark.sql import functions as F
    from pyspark.sql.types import StructType, StructField, StringType, ArrayType
    
    # 预处理字段,修正为合法JSON数组格式
    df = dsdf.withColumn("formatted_text", F.concat(F.lit("["), F.regexp_replace(F.col("text"), "'", "\""), F.lit("]")))
    
  2. 定义正确的Schema
    现在要解析的是JSON数组,每个元素是带text字段的结构体,所以Schema需定义为数组类型:

    item_schema = StructType([StructField("text", StringType(), True)])
    array_schema = ArrayType(item_schema)
    
  3. 解析JSON并提取目标数组
    用from_json解析后,通过transform提取每个结构体里的text字段,得到最终的字符串数组:

    df = df.withColumn("parsed", F.from_json(F.col("formatted_text"), array_schema))
    df = df.withColumn("text_array", F.transform(F.col("parsed"), lambda x: x["text"]))
    
  4. 查看结果
    执行df.select("text", "text_array").show(truncate=False),就能得到预期的['abc','def']格式数组。

完整代码示例

from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.sql.types import StructType, StructField, StringType, ArrayType

spark = SparkSession.builder.appName("json_parse").getOrCreate()

# 模拟你的数据源
data = [("{'text':'abc'},{'text':'def'}",)]
dsdf = spark.createDataFrame(data, ["text"])

# 预处理字符串
df = dsdf.withColumn("formatted_text", F.concat(F.lit("["), F.regexp_replace(F.col("text"), "'", "\""), F.lit("]")))

# 定义Schema
item_schema = StructType([StructField("text", StringType(), True)])
array_schema = ArrayType(item_schema)

# 解析并提取目标数组
df = df.withColumn("parsed", F.from_json(F.col("formatted_text"), array_schema))
df = df.withColumn("text_array", F.transform(F.col("parsed"), lambda x: x["text"]))

# 展示结果
df.select("text", "text_array").show(truncate=False)

执行后输出:

+-----------------------------+------------+
|text                         |text_array  |
+-----------------------------+------------+
|{'text':'abc'},{'text':'def'}|[abc, def]  |
+-----------------------------+------------+

内容的提问来源于stack exchange,提问作者Scouser57

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:00:49