Spark:子集几列并删除空行

时间:2017-03-28 10:21:32

标签: apache-spark

我在Windows 10上运行spark 2.1,我已经使用JDBC从MySQL获取数据并且表格看起来像这样

x      y       z
------------------
1      a       d1
Null   v       ed
5      Null    Null
7      s       Null
Null   bd      Null

我想在上表中创建一个只有x and y columns的新火花数据集,而我不想只保留那两列中任何一列都没有空的那些行。我得到的表应该是这样的

x      y
--------
1      a
7      s

以下是代码:

val load_DF = spark.read.format("jdbc").option("url", "jdbc:mysql://100.150.200.250:3306").option("dbtable", "schema.table_name").option("user", "uname1").option("password", "Pass1").load()
val filter_DF = load_DF.select($"x".isNotNull,$"y".isNotNull).rdd
// lets print first 5 values of filter_DF
filter_DF.take(5)
res0: Array[org.apache.spark.sql.Row] = Array([true,true], [false,true], [true,false], [true,true], [false,true])

如图所示,上面的结果并没有给出实际值,但它返回布尔值(当值不是Null时为true,当值为Null时为false)

4 个答案:

答案 0 :(得分:1)

试试这个;

val load_DF = spark.read.format("jdbc").option("url", "jdbc:mysql://100.150.200.250:3306").option("dbtable", "schema.table_name").option("user", "uname1").option("password", "Pass1").load()

现在;

load_DF.select($"x",$"y").filter("x !== null").filter("y !== null")

答案 1 :(得分:1)

Spark提供DataFrameNaFunctions用于删除空值等目的

在上面的示例中,您只需要在加载的DataSet上调用以下内容

val noNullValues = load_DF.na.drop("all", Seq("x", "y"))

这将删除在xy字段中出现空值而不是z的记录。您可以在DataFrameNaFunctions上阅读更多选项以填写数据,或在需要时翻译值。

答案 2 :(得分:1)

在na.drop中应用“ any”:

df = df.select("x", "y")
       .na.drop("any", Seq("x", "y"))

答案 3 :(得分:0)

当您执行isNotNull时,您只是将一个函数(在本例中为select)应用于值 - 而是需要将select替换为filter

val filter_DF = load_DF.filter($"x".isNotNull && $"y".isNotNull)

或者如果您愿意:

val filter_DF = load_DF.filter($"x".isNotNull).filter($"y".isNotNull)