Spark-Sql中

时间:2015-12-03 08:49:31

标签: sql scala apache-spark dataframe apache-spark-sql

在发布此问题之前,我做了2小时的火花文档阅读。

我有一个Spark数据帧。它有9列。我想过滤3列(A,B,C)上的数据,其中包含字符串 - “无”。我尝试使用过滤器选项。它适用于单个列,但不适用于列组。

val cleanedDF = joinedDF
  .filter(joinedDF("A") !== ("None")
  .joinedDF("B") !== ("None")
  .joinedDF("C") !== ("None"))

这适用于各个列,但如何为一组列提供某些内容?即如果所有列中都包含“无”,则仅筛选出列,如下所示。有可能吗?

val cleanedDF = joinedDF.filter(
  joinedDF("A") !== ("None") and
  joinedDF("B") !== ("None") and
  joinedDF("C") !== ("None"))

我也尝试过转换为SQL模板并查询它。但由于我的过滤器选项是一个字符串,我不能在where子句中使用它。有人也可以告诉我spark-sql中的正确转义字符是什么吗?

示例:

joinedDF.registerTempTable("df")
sqlContext.sql("SELECT *  FROM df where B = `None` " ).show()

任何建议或帮助表示赞赏!

由于

1 个答案:

答案 0 :(得分:3)

使用DataFrame API:

val df = sc.parallelize(Seq(
  ("None", "a", "b"), ("c", "None", "d"), ("e", "f", "None"), ("g", "h", "i")
)).toDF("A", "B", "C")

df.where(($"A" !== "None") && ($"B" !== "None") && ($"C" !== "None")).show

// +---+---+---+
// |  A|  B|  C|
// +---+---+---+
// |  g|  h|  i|
// +---+---+---+

使用SQL:

df.registerTempTable("df")

val query = """SELECT * FROM df 
               WHERE A != "None" AND B != "None" AND C != "None""""

sqlContext.sql(query).show

// +---+---+---+
// |  A|  B|  C|
// +---+---+---+
// |  g|  h|  i|
// +---+---+---+