【问题标题】:where clause not working in spark sql dataframewhere 子句在 spark sql 数据框中不起作用
【发布时间】:2017-02-23 07:41:59
【问题描述】:

我创建了一个包含 3 列的数据框:zip、lat、lng

我想选择 zip = 00650 的 lat 和 lng 值

所以,我尝试使用:

sqlContext.sql("select lat,lng from census where zip=00650").show()

但它返回 ArrayOutOfBound 异常,因为它没有任何值。 如果我删除 where 子句,它运行良好。

有人可以解释我做错了什么吗?

更新:

数据框架构:

root 
|-- zip: string (nullable = true) 
|-- lat: string (nullable = true) 
|-- lng: string (nullable = true)

前 10 行是:

+-----+---------+-----------+
|  zip|      lat|        lng|
+-----+---------+-----------+
|00601|18.180555| -66.749961|
|00602|18.361945| -67.175597|
|00603|18.455183| -67.119887|
|00606|18.158345| -66.932911|
|00610|18.295366| -67.125135|
|00612|18.402253| -66.711397|
|00616|18.420412| -66.671979|
|00617|18.445147| -66.559696|
|00622|17.991245| -67.153993|
|00623|18.083361| -67.153897|
|00624|18.064919| -66.716683|
|00627|18.412600| -66.863926|
|00631|18.190607| -66.832041|
|00637|18.076713| -66.947389|
|00638|18.295913| -66.515588|
|00641|18.263085| -66.712985|
|00646|18.433150| -66.285875| 
|00647|17.963613| -66.947127|
|00650|18.349416| -66.578079|

【问题讨论】:

  • 你能用dataFrame.printSchema()显示你的数据框的架构吗
  • root |-- zip: string (nullable = true) |-- lat: string (nullable = true) |-- lng: string (nullable = true)

标签: sql scala apache-spark


【解决方案1】:

正如您在架构中看到的那样,zip 的类型为 String,因此您的查询应该是这样的

sqlContext.sql("select lat, lng from census where zip = '00650'").show()

更新:

如果您使用的是Spark 2,那么您可以这样做:

import sparkSession.sqlContext.implicits._

val dataFrame = Seq(("10.023", "75.0125", "00650"),("12.0246", "76.4586", "00650"), ("10.023", "75.0125", "00651")).toDF("lat","lng", "zip")

dataFrame.printSchema()

dataFrame.select("*").where(dataFrame("zip") === "00650").show()

dataFrame.registerTempTable("census")

sparkSession.sqlContext.sql("SELECT lat, lng FROM census WHERE zip = '00650'").show()

输出:

root
 |-- lat: string (nullable = true)
 |-- lng: string (nullable = true)
 |-- zip: string (nullable = true)

+-------+-------+-----+
|    lat|    lng|  zip|
+-------+-------+-----+
| 10.023|75.0125|00650|
|12.0246|76.4586|00650|
+-------+-------+-----+

+-------+-------+
|    lat|    lng|
+-------+-------+
| 10.023|75.0125|
|12.0246|76.4586|
+-------+-------+

【讨论】:

  • 是的,我也试过了,但它仍然没有返回任何内容
  • 更新版本也出现同样的错误 - ArrayIndexOutOfBound。我认为问题出在数据上,但行如下:00650,18.349416, -66.578079 我认为这没有错。
  • @Ishan 你能把数据框打印 10 行并显示出来吗?
  • 你试过这个dataFrame.select("*").where(dataFrame("zip") === "00650").show() ??
  • 如果您使用spark-shell 运行它,那么您可以使用dataFrame.where($"zip" === "00650").show()
【解决方案2】:

我使用 RDD 而不是 DataFrame 解决了我的问题。它为我提供了想要的结果:

val data = sc.textFile("/home/ishan/Desktop/c").map(_.split(","))
val arr=data.filter(_.contains("00650")).take(1)
arr.foreach{a => a foreach println}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    相关资源
    最近更新 更多