2017-06-13 82 views
0

是否有一種有效的方法來根據input_file_name過濾輸入文件中的火花數據幀而不讀取所有文件的內容?`input_file_name`上的過濾器火花路徑

我有一個S3的路徑與許多大gzipped csvs(xx.csv.gz),我通過spark.read.csv("path/to/csvs/*")閱讀。我想根據文件名過濾輸入,而不使用glob模式。

但是,當我使用withColumn("file_name", input_file_name())將輸入文件名添加到Dataframe並使用where進行過濾時,我看到所有文件都被處理並讀取。

有沒有一種更有效的方法來做到這一點,而不訴諸處理所有的每個文件?

謝謝!

+0

您可以隨時直接查詢文件系統,繞過Spark。如果是HDFS,你可以這樣做:https://stackoverflow.com/questions/23478377/listing-all-files-available-in-spark-cluster-stored-on-hadoop-hdfs-using-scala-o – jamborta

回答

-1

全局模式正在爲您進行過濾。它不是針對對象存儲的最有效的代碼,但它正在進行匹配。

是否有一些S3性能/節流問題?

+0

感謝您的迴應!可悲的glob模式對於我想要做的過濾來說不夠強大(比如說一些字符串提取和計算)。這就是爲什麼我問'沒有glob模式'。即使數據被過濾掉,使用'input_file_name'結束讀取整個文件。理想情況下,火花會推下過濾器,只讀取文件名,跳過文件內容的讀取。我很好奇,如果有一種有效的方法可以做到上面使用文件系統直接ala @ jamborta的評論來進行預過濾。 –

+0

不確定。我知道,對於流媒體,你可以定義你自己的輸入源(它可以做你想要的任何過濾),也許你可以做一些批量查詢。 –