簡體   English   中英

在Spark數據框上對列值使用過濾器時出錯

[英]Error using filter on column value with Spark dataframe

請參考下面的示例代碼:

sampleDf >我要在2列startIPIntendIPInt上過濾的示例Scala數據幀。

var row = sampleDf.filter("startIPInt <=" + ip).filter("endIPInt >= " + ip)

我現在想查看該行的內容。 以下僅需花費幾秒鍾即可執行,但不會向我顯示此行對象的內容:

println(row)

但是這段代碼執行時間太長:

row.show()

所以我的問題是我應該如何查看該行對象的內容? 還是我過濾數據框的方式有任何問題?

我最初的方法是使用此處提到的過濾器: https : //spark.apache.org/docs/1.5.0/api/java/org/apache/spark/sql/DataFrame.html#filter(java.lang.String )

據此,以下代碼行給了我關於“重載方法'filter'”的錯誤:

var row = sampleDf.filter($"startIPInt" <= ip).filter($"endIPInt" >= ip)

誰能幫助我了解這里發生了什么? 而這是如上所述篩選和獲取數據幀內容的正確,最快的方法。

首先,使用filter並不會真正獲得行/行對象,而是會獲得一個新的數據框。

show花較長時間執行的原因是由於Spark懶惰。 它僅在對數據幀執行操作時才計算轉換(請參見例如Spark轉換-為什么它是惰性的,其優點是什么? )。 在數據幀上使用println不會做任何事情,並且實際上不會計算過濾器轉換。 另一方面, show需要一些計算,這就是為什么它執行起來較慢的原因。

運用

sampleDf.filter("startIPInt <=" + ip).filter("endIPInt >= " + ip)

sampleDf.filter($"startIPInt" <= ip).filter($"endIPInt" >= ip)

是等效的,並且只要導入了Spark隱式變量(使用$表示法),就應得到相同的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM