Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Pyspark:将tar.gz文件加载到数据帧中,并按文件名进行筛选_Apache Spark_Pyspark_Tar_Pyspark Dataframes - Fatal编程技术网

Apache spark Pyspark:将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").\

我有一个tar.gz文件,它有多个文件。层次结构如下所示。我的意图是读取tar.gz文件,过滤掉
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()
方法为您提供了筛选文件的位置。值得一试。