我有一个数据帧,我试图展平。作为该过程的一部分,我想分解它,所以如果我有一列数组,数组的每个值将用于创建一个单独的行。例如,Spark sql如何在不丢失空值的情况下如何爆炸
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
我怎么能爆炸我的阵列,这样我就不会失去空行?
我使用星火1.5.2和Java 8
看起来不错,谢谢!我有一个后续问题:如果我的列类型是一个StructType?我尝试使用cast(新的StructType()),但是我得到了'数据类型不匹配:THEN和ELSE表达式应该都是相同的类型或强制到一个常见的类型;'我试图使我的方法尽可能通用,所以它适合所有列类型。 – alexgbelov
此外,要获取列类型,我使用DataFrame.dtypes()。有没有更好的方法来获取列类型? – alexgbelov
a)您必须提供所有字段的完整模式。 b)'dtypes'或'schema'。 – zero323