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