Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 如何分解PySpark中的嵌套数据帧并将其进一步存储到配置单元_Json_Apache Spark_Dataframe_Hive_Pyspark - Fatal编程技术网

Json 如何分解PySpark中的嵌套数据帧并将其进一步存储到配置单元

Json 如何分解PySpark中的嵌套数据帧并将其进一步存储到配置单元,json,apache-spark,dataframe,hive,pyspark,Json,Apache Spark,Dataframe,Hive,Pyspark,我面临一个特定的问题,我的JSON结构如下:- {A:value, B:value, C:Array<Struct<A1:value,B1:value, C1:Array<struct<A2:value,B2:value>>>> } 我正在使用pyspark数据帧进行此操作,但找不到正确爆炸的方法。感谢您的帮助 让我们从一个示例数据帧开始,它与您指定的模式相同: import pyspark.sql.函数作为psf df=sc.parallel

我面临一个特定的问题,我的JSON结构如下:-

{A:value,
B:value,
C:Array<Struct<A1:value,B1:value, C1:Array<struct<A2:value,B2:value>>>>
}

我正在使用pyspark数据帧进行此操作,但找不到正确爆炸的方法。感谢您的帮助

让我们从一个示例数据帧开始,它与您指定的模式相同:

import pyspark.sql.函数作为psf
df=sc.parallelize([“a”、“b”、“c.a1”、“c.b1”、“c.c1.a2”、“c.c1.a3”])).toDF([“a”、“b”、“a1”、“b1”、“a2”、“B2”]))\
。选择(“A”、“B”、psf.array(psf.struct(“A1”、“B1”)、psf.array(psf.struct(“A2”、“B2”))。别名(“C1”)。别名(“C”))
df.printSchema()
根
|--A:字符串(nullable=true)
|--B:字符串(nullable=true)
|--C:数组(可空=假)
||--元素:struct(containsnall=false)
|| |--A1:字符串(nullable=true)
|| |--B1:字符串(nullable=true)
|| |--C1:数组(可空=假)
|| | |--元素:struct(containsnall=false)
|| | | |--A2:字符串(nullable=true)
|| | | |--B2:字符串(nullable=true)
选择列时,可以使用
*
内联分解
StructType
的元素(即
select(“C1.*”)
如果
C1
StructType
)。因为这些
StructType
s嵌套在
ArrayType
中,所以您的情况要复杂一些。尽管如此,在Spark2中,您可以访问
ArrayType
中包含的
StructType
的嵌套元素,输出将是这些元素的
ArrayType

df.选择(“C.A1”).显示()
+------+
|A1|
+------+
|[c.a1]|
+------+
您可以使用以下功能自动化此过程:

要获取列的嵌套列,请执行以下操作:

def get_子目录(df,col):
如果在df.cols中有col:
如果s[“name”]==col][0],则df.schema.jsonValue()[“fields”]中s的子模式为[s[“type”][“elementType”][“fields”]
返回子模式中s的[s[“name”]
其他:
一无所获
要将数据帧展平一个级别,请执行以下操作:

重新导入
def展平测向(测向):
如果不重新匹配,则df.dtypes中的c为非嵌套的[c[0](“arrayI正在进行回溯(最近的调用):文件“”,文件“”中的第1行,get\u subcols中的第3行KeyError:“elementType”这样的错误与我的情况完全一致,请帮助。我现在该怎么办
{
A:value,
B:value,
A1:value,
B1:value,
A2:value,
B2:value
}