私は平らにしようとしているデータフレームを持っています。プロセスの一環として、私はそれを分解したいので、配列の列がある場合、配列の各値は別々の行を作成するために使用されます。例えば、スパークSQL NULL値を失うことなく爆発する方法
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
偉大に見える、ありがとうございました!私はフォローアップの質問があります:もし私の列の型がStructTypeならどうですか?私はcast(new StructType())を使ってみましたが、データ型の不一致があります:THENとELSE式はすべて共通の型になります。すべての列型に適合します。 – alexgbelov
また、列の型を取得するために、DataFrame.dtypes()を使用しています。列の型を取得するより良い方法はありますか? – alexgbelov
a)すべてのフィールドに完全スキーマを提供する必要があります。 b) 'dtypes'または' schema'です。 – zero323