Python Pyspark将csv文件拆分为数据包

Python Pyspark将csv文件拆分为数据包,python,csv,apache-spark,split,pyspark,Python,Csv,Apache Spark,Split,Pyspark,我是spark的新手,我还在进行第一次测试。我安装了一个节点,并将其作为主节点,运行在一台像样的服务器上: pyspark --master local[20] 当然,我在使用pyspark的第一步中遇到了一些困难 我有一个40GB的CSV文件,上面有大约3亿行。我想做的是找到最快的方法来分割这个文件,并将其制作成小的包,并将其存储为CSV文件。为此,我有两种情况: 第一个。无条件拆分文件。把它平均分成100块(每排300万行) 第二个。我正在加载的CSV数据是一个表格数据,我有一列X和100

我是spark的新手,我还在进行第一次测试。我安装了一个节点,并将其作为主节点,运行在一台像样的服务器上:

pyspark --master local[20]
当然,我在使用pyspark的第一步中遇到了一些困难

我有一个40GB的CSV文件,上面有大约3亿行。我想做的是找到最快的方法来分割这个文件,并将其制作成小的包,并将其存储为CSV文件。为此,我有两种情况:

第一个。无条件拆分文件。把它平均分成100块(每排300万行)

第二个。我正在加载的CSV数据是一个表格数据,我有一列X和100K个不同的ID。我想做的是创建一组字典,并创建较小的CSV文件,字典将告诉我每行应该放在哪个包中

到目前为止,这就是我现在的处境:

sc=SparkContext.getOrCreate()

file_1 = r'D:\PATH\TOFILE\data.csv'

sdf = spark.read.option("header","true").csv(file_1, sep=";", encoding='cp1252')
谢谢你的帮助

实现这一点的最佳(可能也是“最快”)方法是利用Spark内置的RDD分区,并从每个分区写入一个CSV文件。您可以
重新分区
合并
来创建所需数量的分区(比如100个)。这将为您提供最大的并行性(基于您的集群资源和配置),因为每个Spark执行器一次在一个分区上执行任务

您可以执行以下操作之一:

  • 在数据帧上执行
    mapPartition
    ,并将每个
    分区
    写入一个唯一的CSV文件

  • 或者
    df.write.partitionBy(“X”).csv(“mycsv.csv”)
    ,它将在
    “X”

  • 注意。如果使用HDFS存储CSV文件,Spark将自动创建多个文件来存储不同的分区(创建的文件数=RDD分区数)。

    最好的(可能是“最快的”)实现这一点的方法是利用Spark内置的RDD分区,并从每个分区写入一个CSV文件。您可以
    重新分区
    合并
    来创建所需数量的分区(比如100个)。这将为您提供最大的并行性(基于您的集群资源和配置),因为每个Spark执行器一次在一个分区上执行任务

    您可以执行以下操作之一:

  • 在数据帧上执行
    mapPartition
    ,并将每个
    分区
    写入一个唯一的CSV文件

  • 或者
    df.write.partitionBy(“X”).csv(“mycsv.csv”)
    ,它将在
    “X”


  • 注意。如果使用HDFS存储CSV文件,Spark将自动创建多个文件来存储不同的分区(创建的文件数=RDD分区数)。

    我最后做的是将数据加载为Spark数据帧,Spark自动创建大小相等的128MB分区(配置单元的默认配置)然后,我使用
    repartition
    方法根据数据帧上特定列的值重新分配行

    # This will load my CSV data on a spark dataframe and will generate the requiered amount of 128MB partitions to store my raw data.
    sdf = spark.read.option('header','true').csv(file_1, sep=';', encoding='utf-8')
    # This line will redistribute the rows of each paritition according the values on a specific column. Here I'm placing all rows with the same set of values on the same partition and I'm creating 20 of them. (Sparks handle to allocate the rows so the partitions will be the same size)
    sdf_2 = sdf.repartition(20, 'TARGET_COLUMN')
    # This line will save all my 20 partitions on different csv files
    sdf_2.write.saveAsTable('CSVBuckets', format='csv', sep=';', mode='overwrite', path=output_path, header='True')
    

    我最后做的是将数据加载为spark数据帧,spark自动创建大小相等的128MB分区(配置单元的默认配置),然后我使用
    重新分区
    方法根据数据帧上特定列的值重新分配行

    # This will load my CSV data on a spark dataframe and will generate the requiered amount of 128MB partitions to store my raw data.
    sdf = spark.read.option('header','true').csv(file_1, sep=';', encoding='utf-8')
    # This line will redistribute the rows of each paritition according the values on a specific column. Here I'm placing all rows with the same set of values on the same partition and I'm creating 20 of them. (Sparks handle to allocate the rows so the partitions will be the same size)
    sdf_2 = sdf.repartition(20, 'TARGET_COLUMN')
    # This line will save all my 20 partitions on different csv files
    sdf_2.write.saveAsTable('CSVBuckets', format='csv', sep=';', mode='overwrite', path=output_path, header='True')
    

    分割csv文件的最简单方法是使用名为
    split
    的unix UTIL

    只需googlesplitunix命令行。
    我使用
    split-l 3500 XBTUSDorderbooks4.csv订单来拆分我的文件

    拆分csv文件最简单的方法是使用名为
    split
    的unix UTIL

    只需googlesplitunix命令行。
    我使用
    split-l 3500 xbtusdorderbooks 4.csv订购本拆分了我的文件

    非常感谢您的回复。我阅读了有关
    分区
    和操作
    重新分区
    合并
    的更多信息。最后,我能够将我的原始文件拆分为大小非常均匀的分区,每个分区上都包含一组相同的值…非常感谢您的回复。我阅读了有关
    分区
    和操作
    重新分区
    合并
    的更多信息。最后,我能够将我的原始文件分割成大小非常均匀的分区,每个分区上都包含一组相同的值。。。