我有一個資料框,可以在多列上過濾(非空)。這些列來自組態檔。
假設我有一個組態檔,其中包含filterCols: COLUMN_1,COLUMN_2...,COLUMN_10.
在我的代碼中,我可以對列名稱進行硬編碼,例如:
df = dataDF.filter(~col("COLUMN_1").isNull() &
~col("COLUMN_2").isNull() &
......
~col("COLUMN_10").isNull())
但是這些列可以在需要時洗掉,或者也可以添加更多列。
如果我按照上述方法,我將不得不每次更改和部署代碼。
有沒有辦法回圈遍歷這些列然后過濾?
我試過這樣的事情:
colList = ['COLUMN_1', 'COLUMN_2', ...,'COLUMN_10']
df = dataDF
for name in colList:
df = df.filter(~col(name).isNull())
但df顯示零記錄。
uj5u.com熱心網友回復:
您可以根據您的列生成查詢字串并使用 SparkSQL。
例子:
spark = SparkSession.builder.getOrCreate()
data = [
{"a": 1, "b": 2, "c": 3},
{"a": 1, "b": 2, "c": 3},
{"a": 1, "b": 2, "c": 3, "d": 4},
]
df = spark.createDataFrame(data)
columns = ["a", "b", "c", "d"]
df.createTempView("table")
df = spark.sql(
"SELECT * FROM table WHERE {}".format(
" AND ".join(x " IS NOT NULL" for x in columns)
)
)
結果:
--- --- --- ---
|a |b |c |d |
--- --- --- ---
|1 |2 |3 |4 |
--- --- --- ---
uj5u.com熱心網友回復:
使用pythonfunctools.reduce鏈接多個條件:
from functools import reduce
import pyspark.sql.functions as F
filter_expr = reduce(lambda a, b: a & b, [F.col(c).isNotNull() for c in colList])
df = df.filter(filter_expr)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/360764.html
