spark中的分区发现未显示正确的分区号

问题描述 投票:0回答:1

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个数据框。因此,我想根据国家和地区对数据进行分区,以避免在节点之间进行混排(尽管在节点内可能会发生混排,但我不会感到烦恼)。您能否让我知道这种理解是否正确
apache-spark apache-spark-sql pyspark-sql hadoop-partitioning
1个回答
0
投票

您能否尝试提供.csv()方法的基本路径。

不带通配符,只有“ D:\\ Sonika \\ Propcount \\”

© www.soinside.com 2019 - 2024. All rights reserved.