有没有一种方法可以扁平化一个任意嵌套的Spark Dataframe?我看到的大多数工作都是为特定的模式编写的,我希望能够通用地扁平化一个具有不同嵌套类型的Dataframe(例如StructType,ArrayType,MapType等)。
假设我有一个模式:
StructType(List(StructField(field1,...), StructField(field2,...), ArrayType(StructType(List(StructField(nested_field1,...), StructField(nested_field2,...)),nested_array,...)))
希望将其调整为具有如下结构的平面表:
field1
field2
nested_array.nested_field1
nested_array.nested_field2
顺便说一句,寻找Pyspark的建议,但Spark的其他口味也很受欢迎。
6条答案
按热度按时间uxh89sit1#
这个问题可能有点老了,但是对于那些仍然在寻找解决方案的人来说,可以使用select * 内联地扁平化复杂的数据类型:
首先让我们创建嵌套 Dataframe :
现在把它压平:
您可以在这里找到有用的示例:https://docs.databricks.com/delta/data-transformation/complex-types.html
如果嵌套数组太多,可以用途:
ghg1uchk2#
这将展平同时具有structtype和****arraytype的嵌套df。通常在通过Json阅读数据时很有用。在此https://stackoverflow.com/a/56533459/7131019上进行了改进
**
o3imoua43#
这是我的最后一个方法:
1)将 Dataframe 中的行Map到dict的rdd。在线查找合适的python代码来扁平化dict。
其中
2)将RDD[dict]转换回 Dataframe
sgtfey8w4#
我开发了一种递归方法来扁平化任何嵌套的DataFrame。
在GitHub平台上实现了AWS数据管理器。
Spark支持在包中已经过时了,但是代码库仍然有用。
sycxhyv75#
我是这样写的:
解决方案不会删除现有列。
嵌套列的类型为StructType,对于StructType,needConversion()方法返回True。
(注意,对于其他一些类型,needConversion()返回True,但它们不是我的 Dataframe 的一部分)
对我来说,它产生了与使用堆栈的解决方案类似的解决方案:https://stackoverflow.com/a/65256632/21404451 .
mi7gmzs66#
下面的要点将使嵌套JSON的结构扁平化,
然后可以将嵌套数据展开为
flatten_data = flatten_frame(nested_df)
这将给予你一个扁平的 Dataframe 。
要点取自https://gist.github.com/DGrady/b7e7ff3a80d7ee16b168eb84603f5599