[英]Create a dataframe only selecting rows that match condition
我在Hive中有一張大桌子(幾十行到幾億行),我只想從中選擇與正則表達式匹配的表。
目前,我有一個小例子,可以首先嘗試我的代碼:
columns = ['id', 'column']
vals = [
(1, "VAL_ID1 BD store"),
(2, "VAL_ID2 BD store"),
(3, "VAL_ID3 BD model"),
(4, "BAD WRONG")
]
df = spark.createDataFrame(vals, columns)
然后我進行了正則表達式測試,如下所示:
df_regex = df.withColumn('newColumn',F.regexp_extract(df['id'], '^(([a-zA-Z]{2}[a-zA-Z0-9]{1})+(_[a-zA-Z]{2}[a-zA-Z0-9]{1})*)(\s|$)',1))
如我所說,這是一個測試數據框。 將來,我會在一張很大的桌子上“看”它。 有什么方法可以只添加與正則表達式匹配的行,從而創建更小的數據框?
現在,我正在讀取每一行,然后添加一列withColumn
,其中包含與正則表達式不匹配的行的空字段。 這樣做是有道理的,但是如果可以避免的話,我覺得不讀取兩次此數據幀有好處。
您想在where
使用。
df.where(
F.regexp_extract(df['id'], '^(([a-zA-Z]{2}[a-zA-Z0-9]{1})+(_[a-zA-Z]{2}[a-zA-Z0-9]{1})*)(\s|$)',1) != F.lit('')
)
實際上,我嘗試了您的正則表達式,但沒有結果。 但是,只要您了解原理,我認為您可以使用該解決方案。
編輯:
我覺得如果可以避免的話,兩次不讀取此數據幀是有好處的。
僅當您執行“操作”時,Spark才會讀取您的數據。 轉換是惰性的,因此僅在最后進行評估...因此無需擔心Spark兩次(或多次)讀取數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.