我有一个要展平的数据框。作为过程的一部分,我想分解它,所以如果我有一列数组,数组的每个值都将用于创建一个单独的行。例如,
id | name | likes
_______________________________
1 | Luke | [baseball, soccer]
应该成为
id | name | likes
_______________________________
1 | Luke | baseball
1 | Luke | soccer
这是我的代码
private DataFrame explodeDataFrame(DataFrame df) {
DataFrame resultDf = df;
for (StructField field : df.schema().fields()) {
if (field.dataType() instanceof ArrayType) {
resultDf = resultDf.withColumn(field.name(), org.apache.spark.sql.functions.explode(resultDf.col(field.name())));
resultDf.show();
}
}
return resultDf;
}
问题是在我的数据中,一些数组列有空值。在这种情况下,整行都将被删除。所以这个数据框:
id | name | likes
_______________________________
1 | Luke | [baseball, soccer]
2 | Lucy | null
成为
id | name | likes
_______________________________
1 | Luke | baseball
1 | Luke | soccer
代替
id | name | likes
_______________________________
1 | Luke | baseball
1 | Luke | soccer
2 | Lucy | null
我怎样才能分解我的数组,这样我就不会丢失空行?
我正在使用 Spark 1.5.2 和 Java 8
原文由 alexgbelov 发布,翻译遵循 CC BY-SA 4.0 许可协议
火花 2.2+
您可以使用
explode_outer
功能:火花 <= 2.1
在 Scala 中,但 Java 等效项应该几乎相同(导入单个函数使用
import static
)。这里的想法基本上是用所需类型的
array(NULL)
替换NULL
。对于复杂类型(又名structs
),您必须提供完整的架构:或者
注意:
如果数组
Column
已使用containsNull
设置为false
创建,您应该首先更改它(使用 Spark 2.1 测试):