Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.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
PySpark并行读取多个文件_Pyspark_Apache Spark Sql_Pyspark Sql_Parquet - Fatal编程技术网

PySpark并行读取多个文件

PySpark并行读取多个文件,pyspark,apache-spark-sql,pyspark-sql,parquet,Pyspark,Apache Spark Sql,Pyspark Sql,Parquet,我在我的项目中有以下要求,我们正在尝试使用PySpark进行数据处理 我们过去常常以拼花地板文件的形式接收每辆车的传感器数据,以及每辆车的一个文件。该文件有很多传感器,但其结构化数据是拼花格式的。每个文件的平均文件大小为200MB 假设我在一批中收到了如下文件并准备好处理 列车文件大小日期 2018年9月5日凌晨12:10 X1 280MB 2018年9月5日下午5:10 Y1220MB 2018年9月5日04:10上午 Y1241MB 2018年9月5日下午6:10 在处理结束时,我需要从每个

我在我的项目中有以下要求,我们正在尝试使用PySpark进行数据处理

我们过去常常以拼花地板文件的形式接收每辆车的传感器数据,以及每辆车的一个文件。该文件有很多传感器,但其结构化数据是拼花格式的。每个文件的平均文件大小为200MB

假设我在一批中收到了如下文件并准备好处理

列车文件大小日期

2018年9月5日凌晨12:10

X1 280MB 2018年9月5日下午5:10

Y1220MB 2018年9月5日04:10上午

Y1241MB 2018年9月5日下午6:10

在处理结束时,我需要从每个源文件接收一个聚合的.csv文件或一个主文件,其中包含所有这些车辆的聚合数据

我知道HDFS的默认块大小是128MB,每个文件将被分成2个块。我可以知道如何使用PySpark实现此要求吗?可以并行处理所有这些文件吗


请告诉我您的想法

您可以将所有输入文件放在同一个目录中,然后将目录路径传递给spark。您也可以像使用globbing一样使用
/data\u dir/*.csv

我也遇到了类似的问题,似乎我找到了一种方法: 1.获取文件列表 2.并行化此列表(分布在所有节点之间) 3.编写一个函数,从分发到节点的大列表部分读取所有文件的内容 4.使用mapPartition运行它,然后将结果收集为列表,每个元素都是每个文件的收集内容。 存储在AWS s3和json文件上的Fot文件:

def read_files_from_list(file_list):
#reads files from  list
#returns content as list of strings, 1 json per string ['{}','{}',...]
   out=[]
   for x in file_list:
      content = sp.check_output([ 'aws', 's3', 'cp', x, '-']) # content of the file. x here is a full path: 's3://bucket/folder/1.json'
      out.append(content)   
   return out #content of all files from the file_list as list of strings, 1 json per string ['{}','{}',...]


file_list=['f1.json','f2.json',...]
    ps3="s3://bucket/folder/"
    full_path_chunk=[ps3 + f for f in file_list] #makes list  of strings, with full path for each file
    n_parts = 100
    rdd1 = sc.parallelize(full_path_chunk, n_parts ) #distribute files among nodes
    list_of_json_strings = rdd1.mapPartitions(read_files_from_list).collect()
然后,如有必要,您可以创建如下spark数据帧:

rdd2=sc.parallelize(list_of_json_strings) #this is a trick! via http://spark.apache.org/docs/latest/sql-programming-guide.html#json-datasets
df_spark=sqlContext.read.json(rdd2)
函数read_files_from_list只是一个示例,应该将其更改为使用python工具从hdfs读取文件。
希望这有帮助:)

我最近也遇到过类似的情况。
您可以将CSV列表及其路径传递给spark read api,如
spark.read.json(输入文件路径)
()。这将在单个数据帧中加载所有文件,最终执行的所有转换将由多个执行器并行完成,具体取决于您的spark配置。

Hi Hamza。。是的,我看到了一些答案,我可以把所有的文件放在一个目录中。如果我这样做,我是否能够使用Spark并行处理每个文件,以防我想为每个i/p文件生成.csv文件作为输出?我认为Spark可以处理它。Spark将把他们分配给工人。每个工作者将处理自己的分区。使用spark数据结构时无需考虑并行性。因此,目录中的所有文件将在处理期间加载到RDD中,并跨集群中的节点进行分区。因此,Spark将目录中的所有文件视为单个文件。是吗?是的。如果需要,您还可以对每个分区重新分区或应用函数。最后一个问题。。有点困惑。。如果我想处理集群中一个节点中的每个文件,该怎么办。。?假设我有4个文件,我希望集群中的4个diff节点通过将每个文件作为一个分区来处理它谢谢你lugger1。。快速问题-sc.parallelize(完整路径块,n部分)是否将文件列表拆分为100个块,并作为100个分区发送到集群节点?是的,它在节点之间分配完整列表的100部分,因此如果节点数量固定,比如说4个(每个都有8个核),使用4*8*3=96代替100以获得更好的性能。在函数中,从文件列表(文件列表)读取文件,sp是什么@lugger1sp是子流程。在“将子流程作为sp导入”行之前的某个地方。Hi@lugger1将“从列表中读取文件”用于处理拼花地板文件?