使用星火1.5和Scala 2.10.6與行字段過濾器火花數據幀是字符串
我試圖通過現場「標籤」這是一個字符串數組來過濾數據幀的數組。尋找具有'私人'標籤的所有行。
val report = df.select("*")
.where(df("tags").contains("private"))
越來越:
異常線程 「main」 org.apache.spark.sql.AnalysisException: 無法解析 '包含(標籤專用)' 由於數據類型不匹配: 說法1需要字符串類型,但是,「標籤」是數組 類型。
過濾方法更適合嗎?
更新:
數據從卡桑德拉適配器,但一個小例子來顯示我想要做的,也得到了上面的錯誤是:
def testData (sc: SparkContext): DataFrame = {
val stringRDD = sc.parallelize(Seq("""
{ "name": "ed",
"tags": ["red", "private"]
}""",
"""{ "name": "fred",
"tags": ["public", "blue"]
}""")
)
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._
sqlContext.read.json(stringRDD)
}
def run(sc: SparkContext) {
val df1 = testData(sc)
df1.show()
val report = df1.select("*")
.where(df1("tags").contains("private"))
report.show()
}
更新:標籤陣列可以是任何長度和「私人」標籤可以是在任何位置
更新:一個解決方案,它的工作原理:UDF
val filterPriv = udf {(tags: mutable.WrappedArray[String]) => tags.contains("private")}
val report = df1.filter(filterPriv(df1("tags")))
發佈您的數據樣本以及如何創建df –
一種選擇是構建UDF。 –
那麼,查看源代碼後(因爲'Column.contains'的scaladoc只說「包含其他元素」,這不是很有啓發性),我看到'Column.contains'構造了一個'org.apache的實例.spark.sql.catalyst.expressions.Contains'它說「一個函數,如果字符串'left'包含字符串'right',則返回true。所以看起來'df1(「tags」)。contains'在這種情況下無法做到我們想要的。我不知道有什麼替代建議。 '...表達式中也有一個'ArrayContains',但'Column'似乎沒有使用它。 –