簡體   English   中英

創建僅選擇符合條件的行的數據框

[英]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.

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