簡體   English   中英

讀取 pyspark 中未分區的 csv 文件時跳過特定行

[英]Skip specific row when reading unpartitioned csv file in pyspark

我有一個未分區的 gzip 壓縮 csv 文件,我正在讀入 spark。 讀入 gzip 壓縮文件不是問題,但只要使用觸及特定違規行的操作對 spark dataframe 進行評估,就會拋出錯誤。 如果我使用df.limit()我可以在讀取時將 dataframe 子集化為違規觀察之前的行號,然后可以繼續我的工作流程而不會出錯。

我的問題是,有沒有辦法在觀察中跳過閱讀。 我想按照 df.limit_range(100:200) 的方式做一些事情,在讀取 csv 時跳過第 100-200 行。 我嘗試了各種嘗試來生成索引列然后進行過濾,但我在評估時遇到了問題。 下面我嘗試對違規行之前的所有行進行子集化,然后與原始未過濾的 dataframe 進行反連接,但一旦評估了違規行,就會再次導致錯誤,表明無法讀取 gzip 壓縮文件。

df_full = df.withColumn("rowId", monotonically_increasing_id())
df_head = df_full.limit(100).where(col("rowID") < 99)
anti_df = df_full.join(df_head, "id", "left_anti")

錯誤:

FileReadException: Error while reading file s3a://some-s3-bucket/dir/subdir/file_name.gz.
Caused by: EOFException: Unexpected end of input stream

您可以在列上使用過濾器來讀取除第 100-200 行之外的所有內容。

from pyspark.sql import functions as f

df_full = df.withColumn("rowId", f.monotonically_increasing_id())
anti_df = df_full.filter("rowId <= 100 or rowId >= 200")

anti_df 的anti_df將是:

+----+-----+
|   z|rowId|
+----+-----+
     :
     :
|3.38|   95|
| 3.4|   96|
|4.07|   97|
|3.56|   98|
|3.66|   99|
|3.65|  100|
|3.43|  200|
|3.49|  201|
|3.48|  202|
| 3.6|  203|
|4.08|  204|
|3.63|  205|
     :
     :

只要確保你的過濾器在你的火花計划中被推下。 我的意思是,過濾器應該在讀取之后立即執行,而不是在對其執行多次計算之后執行(此時您的代碼可能會因違規錯誤而失敗)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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