[英]where clause not working in spark sql dataframe
我創建了一個包含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|
正如您在架構中看到的那樣, 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|
+-------+-------+
我使用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}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.