我想保留 ArrayType 列的一行中存在的元素。例如,如果我的 spark 資料框的一行是:
val df = sc.parallelize(Seq(Seq("A", "B"),Seq("C","X"),Seq("A", "B", "C", "D", "Z"))).toDF("column")
---------------
| column|
---------------
| [A, B]|
| [C, X]|
|[A, B, C, D, Z]|
---------------
我有一個dictionary_list = ["A", "Z", "X", "Y"],我希望我的輸出資料框的行是:
val outp_df
---------------
| column|
---------------
| [A]|
| [X]|
| [A, Z]|
---------------
我試過array_contains,array_overlap等,但我得到的輸出是這樣的:
val result = df.where(array_contains(col("column"), "A"))
---------------
| column|
---------------
| [A, B]|
|[A, B, C, D, Z]|
---------------
行正在被過濾,但我想在串列/行本身內部進行過濾。我有什么辦法可以做到這一點?
uj5u.com熱心網友回復:
您得到的結果非常有意義,您只選擇行,其列陣列值包含“A”,即第一行和最后一行。您需要的是一個函式(不是 SQL 過濾器函式),它接收字串的輸入序列,并回傳一個僅包含字典中存在的值的序列。您可以udf像這樣使用 s:
// rename this as you wish
val myCustomFilter: Seq[String] => Seq[String] =
input => input.filter(dictionaryList.contains)
// register to your spark context
// rename this as you wish
spark.udf.register("custom_filter", myCustomFilter)
然后,您需要選擇運算子,而不是過濾運算子!過濾運算子僅選擇row可以滿足謂詞的 s,這不是您想要的。
火花外殼結果:
scala> df.select(expr("custom_filter(column)")).show
--------------
|cusfil(column)|
--------------
| [A]|
| [X]|
| [A, Z]|
--------------
uj5u.com熱心網友回復:
使用filter功能:
val df1 = df.withColumn(
"column",
expr("filter(column, x -> x in ('A', 'Z', 'X', 'Y'))")
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/472151.html
標籤:数据框 斯卡拉 阿帕奇火花 apache-spark-sql
