繁体   English   中英

在 Java 中删除多列 Spark DataFrame

[英]Dropping multiple columns of Spark DataFrame in Java

我使用的是 Spark 1.5.3,我尝试在 spark dataFrame 中分离偶数列和奇数列,

String filePath = "/home/inputData.txt";
DataFrame inputDataFrame = sql.read().format("com.databricks.spark.csv") //No I18N
    .option("inferSchema", "true") //No I18N
    .option("delimiter", ",") //No I18N
    .option("header", "false") //No I18N
    .load(filePath);

inputDataFrame.show();

List<String> evenColumns = Arrays.asList("C0", "C2", "C4", "C6", "C8", "C10", "C12");
DataFrame oddDataFrame = inputDataFrame.na().drop(JavaConversions.asScalaBuffer(evenColumns));
DataFrame evenDataFrame = inputDataFrame.selectExpr(JavaConversions.asScalaBuffer(evenColumns));

evenDataFrame.show();
oddDataFrame.show();

上述代码的输出:

输入数据帧:

+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| C0| C1| C2| C3| C4| C5| C6| C7| C8| C9|C10|C11|C12|C13|
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|  0|  0|  0|  0|  1|  0|  0|  0|  2|  3|  2|  2|  0|  5|
|  1|  5|  6|  0| 14|  0|  5|  0| 95|  2|120|  0|  0|  9|
|  1|  6|  1|  0|  3|  0|  4|  0| 21| 22| 11|  0|  0| 23|
|  1|  0|  1|  0|  1|  0|  4|  0|  1|  4|  2|  0|  0|  5|
|  1| 37|  9|  0| 19|  0| 31|  0| 87|  9|108|  0|  0|170|
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

偶数数据帧:

+---+---+---+---+---+---+---+
| C0| C2| C4| C6| C8|C10|C12|
+---+---+---+---+---+---+---+
|  0|  0|  1|  0|  2|  2|  0|
|  1|  6| 14|  5| 95|120|  0|
|  1|  1|  3|  4| 21| 11|  0|
|  1|  1|  1|  4|  1|  2|  0|
|  1|  9| 19| 31| 87|108|  0|
+---+---+---+---+---+---+---+

奇数数据帧:

+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| C0| C1| C2| C3| C4| C5| C6| C7| C8| C9|C10|C11|C12|C13|
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|  0|  0|  0|  0|  1|  0|  0|  0|  2|  3|  2|  2|  0|  5|
|  1|  5|  6|  0| 14|  0|  5|  0| 95|  2|120|  0|  0|  9|
|  1|  6|  1|  0|  3|  0|  4|  0| 21| 22| 11|  0|  0| 23|
|  1|  0|  1|  0|  1|  0|  4|  0|  1|  4|  2|  0|  0|  5|
|  1| 37|  9|  0| 19|  0| 31|  0| 87|  9|108|  0|  0|170|
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

在上面的数据evenColumns中没有执行删除 evenColumns。 我做错了什么? 预期输出是

+---+---+---+---+---+---+---+
| C1| C3| C5| C7| C9|C11|C13|
+---+---+---+---+---+---+---+
|  0|  0|  0|  0|  3|  2|  5|
|  5|  0|  0|  0|  2|  0|  9|
|  6|  0|  0|  0| 22|  0| 23|
|  0|  0|  0|  0|  4|  0|  5|
| 37|  0|  0|  0|  9|  0|170|
+---+---+---+---+---+---+---+

na().drop用于删除包含 null 或 NaN 值的行。 要删除列而不管它们包含什么,只需使用drop() 在这种情况下,它应该是:

inputDataFrame.drop(JavaConversions.asScalaBuffer(evenColumns));

这是一种间接/解决方法

public static DataFrame drop(DataFrame dataFrame, List<String> dropCol) {
List<String> colname = Arrays.stream(dataFrame.columns()).filter(col -> !dropCol.contains(col)).collect(Collectors.toList());
// colname list will have the names of the cols except the ones to be dropped.
return dataFrame.selectExpr(JavaConversions.asScalaBuffer(colname));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM