首页 > 解决方案 > 在 Java 中删除多列 Spark DataFrame

问题描述

我正在使用 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在上面的数据帧中没有执行删除。我做错了什么?预期输出为

+---+---+---+---+---+---+---+
| 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|
+---+---+---+---+---+---+---+

标签: javaapache-sparkapache-spark-sql

解决方案


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

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

推荐阅读