【问题标题】:Pyspark split csv file in packetsPyspark 在数据包中拆分 csv 文件
【发布时间】:2018-09-25 22:07:55
【问题描述】:

我是 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')

感谢您的帮助!

【问题讨论】:

    标签: python csv apache-spark split pyspark


    【解决方案1】:

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

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

    1. 在 Dataframe 上执行 mapPartition 并将每个 partition 写入一个唯一的 CSV 文件。

    2. OR df.write.partitionBy("X").csv('mycsv.csv'),这将为"X" 中的每个唯一条目创建一个分区(从而创建一个文件)

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

    【讨论】:

    • 非常感谢您的回复。我阅读了更多关于partitions 以及repartitioncoalesce 的操作。最后,我能够将原始文件拆分为大小非常均匀的分区,每个分区都包含一组相同的值...
    【解决方案2】:

    我最后所做的是将数据加载为 spark 数据帧,并且 spark 自动创建大小相等的 128MB 分区(hive 的默认配置),然后我使用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')
    

    【讨论】:

      【解决方案3】:

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

      只需谷歌拆分 unix 命令行。 我使用split -l 3500 XBTUSDorderbooks4.csv orderbooks分割我的文件

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-30
        • 1970-01-01
        • 1970-01-01
        • 2021-07-25
        • 1970-01-01
        • 2023-04-09
        • 2021-12-03
        • 2016-10-07
        相关资源
        最近更新 更多