我正在使用pyspark阅读下面的json文件:
{
"data": {
"indicatr": {
"indicatr": {
"id": "5c9e41e4884db700desdaad8"}}}}
我写了以下python代码:
from pyspark.sql import Window, DataFrame
from pyspark.sql.types import *
from pyspark.sql.types import StructType
from pyspark.sql import functions as F
schema = StructType([
StructField("data", StructType([
StructField("indicatr", StructType([
StructField("indicatr", StructType([
StructField("id", StringType())
]))]))]))])
df = spark.read.json("pathtofile/test.json", multiLine=True)
df.show()
df2 = df.withColumn("json", F.col("data").cast("string"))
df3=df2.select(F.col("json"))
df3.collect()
df4 =df3.select(F.from_json(F.col("json"), schema).alias("name"))
df4.show()
我得到以下结果:
|name|
+----+
|null|
谁知道如何解决这个问题
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
从你提供的代码和描述来看,问题可能出在几个地方。首先,你的JSON结构和定义的StructType
似乎不完全匹配。其次,在处理多行JSON时,需要确保文件内容正确地被解析。以下是对你的代码进行调整的一些建议:
检查JSON结构:你的JSON示例中有一个小错误,最后一个字段后的多余逗号应该去掉。合法的JSON格式不允许对象或数组的最后一个元素后面有逗号。
修正Schema定义:根据你的JSON数据,schema中的嵌套层级可以简化,因为你实际上只需要定义到"id"这一层。此外,注意到你的JSON路径直接指向"id",所以不需要那么多层级的StructField
。
使用正确的多行读取方式:虽然你已经设置了multiLine=True
来处理多行JSON,但请确认你的JSON文件确实是由多个独立的JSON对象构成,并且每个对象都在新的一行上。如果整个文件是一个大JSON对象(包含一个数组或者直接是多个嵌套的对象),则可能需要不同的处理方式。
修正后的代码示例:
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StructField, StringType
# 初始化SparkSession
spark = SparkSession.builder.getOrCreate()
# 简化并修正schema定义
schema = StructType([
StructField("id", StringType())
])
# 读取JSON文件
df = spark.read.json("pathtofile/test.json", multiLine=True)
# 显示DataFrame以检查是否正确读取
df.show()
# 如果你的JSON文件实际上是每个行为一个完整的JSON对象(即使只有一个),那么上面的读取应该足够了。
# 下面的步骤是为了演示如何从更深层次的数据结构中提取信息,假设"data.indicatr.indicatr.id"是正确的路径。
df_extracted = df.selectExpr("data.indicatr.indicatr.id as id")
df_extracted.show()
请按照实际的JSON文件结构调整上述代码。如果问题依旧,请检查你的JSON文件是否有格式错误,或者数据是否如预期那样被组织。