Spark中的分区发现未显示正确的分区数量

时间:2019-02-05 09:34:01

标签: apache-spark apache-spark-sql pyspark-sql hadoop-partitioning

Spark分区发现未根据文件夹结构对数据进行分区

我在其中有一个名为list的目录,我在每个国家/地区都有一个文件夹,其标签为COUNTRY = US等,在这些国家/地区中,我有一个文件夹调用区域,标签为IKE REGION = NORTH,在region文件夹中有多个csv文件。

Folder structure

现在,我想使用spark 2.3数据帧API在spark中读取此数据,而在读取数据时我正在使用base-path选项,以便spark会自动发现下划线分区。

因为我有2个国家/地区文件夹,并且在一个国家/地区内,我有5个地区,在第二个国家/地区内,我有2个地区。所以总共我有7个地区。因此,我的数据框应将分区号显示为7,而不是数据框将分区数显示为5。

这是供您参考的代码

    start = time.time()
path = "D:\\Sonika\\Propcount\\*\\*\\*.txt"
df_probe_count_base = spark.read.option("header", "true")\
    .option("basePath", "D:\\Sonika\\Propcount")\
    .option("Delimiter", ",").csv(path)

print("df_probe_count_base",df_probe_count_base.rdd.getNumPartitions())
end = time.time()

我也尝试查看哪个行属于哪个分区,并惊讶地发现它随机将日期分配到4个分区中。即在一个分区中,我可以看到这些行属于2个不同的国家,具有2个不同的区域

print(df_probe_count_base.rdd.glom().collect())

[
        Row(_c0='txt', _c1='RowNumber', COUNTRY='CAN', REGION='Reg2'), 
        Row(_c0='0', _c1='1', COUNTRY='CAN', REGION='Reg2'), 
        Row(_c0='0', _c1='2', COUNTRY='CAN', REGION='Reg2'), 
        Row(_c0='0', _c1='3', COUNTRY='CAN', REGION='Reg2'),
        Row(_c0='0', _c1='4', COUNTRY='CAN', REGION='Reg2'),
        Row(_c0='0', _c1='5', COUNTRY='CAN', REGION='Reg2'), 
        Row(_c0='0', _c1='6', COUNTRY='CAN', REGION='Reg2'), 
        Row(_c0='0', _c1='7', COUNTRY='CAN', REGION='Reg2'), 
        Row(_c0='0', _c1='8', COUNTRY='CAN', REGION='Reg2'), 
        Row(_c0='0', _c1='9', COUNTRY='CAN', REGION='Reg2'),
        Row(_c0='0', _c1='10', COUNTRY='CAN', REGION='Reg2'), 
        Row(_c0='txt', _c1='RowNumber', COUNTRY='ABC', REGION='Reg1'), 
        Row(_c0='0', _c1='1', COUNTRY='ABC', REGION='Reg1'), 
        Row(_c0='0', _c1='2', COUNTRY='ABC', REGION='Reg1'), 
        Row(_c0='0', _c1='3', COUNTRY='ABC', REGION='Reg1'), 
        Row(_c0='0', _c1='4', COUNTRY='ABC', REGION='Reg1'),
        Row(_c0='0', _c1='5', COUNTRY='ABC', REGION='Reg1'), 
        Row(_c0='0', _c1='6', COUNTRY='ABC', REGION='Reg1'), 
        Row(_c0='0', _c1='7', COUNTRY='ABC', REGION='Reg1'), 
        Row(_c0='0', _c1='8', COUNTRY='ABC', REGION='Reg1'), 
        Row(_c0='0', _c1='9', COUNTRY='ABC', REGION='Reg1'), 
        Row(_c0='0', _c1='10', COUNTRY='ABC', REGION='Reg1')
    ]

这与配置单元分区不同,因为在HIVE中,该分区只有一个文件,在这种情况下,您可能会有多个文件

任何人都可以建议

  • 分区发现如何在带有CSV文件的spark 2.3中工作
  • 为什么有4个分区而不是7个分区(仅供参考,我的机器上有4个内核)
  • 这样做的整个逻辑是,我有2个具有相同级别的分区数据的不同数据框,稍后我想基于国家,地区和一个主键加入2个数据框。因此,我想根据国家和地区对数据进行分区,以避免在节点之间进行混排(尽管在节点内可能会发生混排,但我不会感到烦恼)。能否请您告诉我这种理解是否正确

0 个答案:

没有答案