Apache spark Pyspark:将tar.gz文件加载到数据帧中,并按文件名进行筛选
我有一个tar.gz文件,它有多个文件。层次结构如下所示。我的意图是读取tar.gz文件,过滤掉Apache spark Pyspark:将tar.gz文件加载到数据帧中,并按文件名进行筛选,apache-spark,pyspark,tar,pyspark-dataframes,Apache Spark,Pyspark,Tar,Pyspark Dataframes,我有一个tar.gz文件,它有多个文件。层次结构如下所示。我的意图是读取tar.gz文件,过滤掉b.tsv的内容,因为它是静态元数据,所有其他文件都是实际记录 gzfile.tar.gz |- a.tsv |- b.tsv |- thousand more files. 通过pyspark加载,我能够将文件加载到数据帧中。我使用命令: spark = SparkSession.\ builder.\ appName("Loading Gzip Files").\
b.tsv
的内容,因为它是静态元数据,所有其他文件都是实际记录
gzfile.tar.gz
|- a.tsv
|- b.tsv
|- thousand more files.
通过pyspark加载,我能够将文件加载到数据帧中。我使用命令:
spark = SparkSession.\
builder.\
appName("Loading Gzip Files").\
getOrCreate()
input = spark.read.load('/Users/jeevs/git/data/gzfile.tar.gz',\
format='com.databricks.spark.csv',\
sep = '\t'
为了过滤,我添加了文件名
from pyspark.sql.functions import input_file_name
input.withColumn("filename", input_file_name())
现在生成的数据如下所示:
|_c0 |_c1 |filename |
|b.tsv0000666000076500001440035235677713575350214013124 0ustar netsaintusers1|Lynx 2.7.1|file:///Users/jeevs/git/data/gzfile.tar.gz|
|2|Lynx 2.7|file:///Users/jeevs/git/data/gzfile.tar.gz|
当然,文件字段正在填充tar.gz文件,这使得这种方法毫无用处。
一个更令人恼火的问题是,_c0正在填充文件名+垃圾+第一行值
此时,我想知道文件读取本身是否变得奇怪,因为它是tar.gz文件。当我们进行这个处理的v1时(spark 0.9),我们有另一个步骤,将数据从s3加载到ec2框中,提取并写回s3。我正试图摆脱这些步骤
提前谢谢 Databricks不支持直接*.tar.gz迭代。为了处理文件,必须将它们解压缩到临时位置。Databricks支持bash,而不是完成任务
%sh find$source-name*.tar.gz-exec tar-xvzf{}-C$destination\;
上述代码将把源位置中扩展名为*.tar.gz的所有文件解压缩到目标位置。
如果路径通过dbutils.widgets或%scala或%pyspark中的static传递,则必须将路径声明为环境变量。
这可以通过%pyspark
导入操作系统
os.environ['source']='/dbfs/mnt/dl/raw/source/'
在*.csv文件中的内容中,使用以下方法加载文件:
DF=spark.read.format('csv')。选项(header='true',inferSchema='true')。选项(“mode”,“dropmorformed”)。加载('/mnt/dl/raw/source/sample.csv'))
您是否已完成此操作:。接受答案中给出的extractFiles()
方法为您提供了筛选文件的位置。值得一试。