Spark使用from_json转换字符串时如何获取完整目标数组?
解决方法
你的原始字符串不是标准JSON格式:既不是单个JSON对象,也不是JSON数组,还使用了JSON不允许的单引号,这是解析不全的核心原因。按以下步骤处理即可实现需求:
预处理字符串,转为合法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("]")))定义正确的Schema
现在要解析的是JSON数组,每个元素是带text字段的结构体,所以Schema需定义为数组类型:item_schema = StructType([StructField("text", StringType(), True)]) array_schema = ArrayType(item_schema)解析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"]))查看结果
执行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
相关产品推荐
相关产品推荐

