代码之家  ›  专栏  ›  技术社区  ›  ira

PySpark:阅读拼花地板时如何在分区列中阅读

  •  0
  • ira  · 技术社区  · 6 年前

    /table_name/year/month/day/ 文件夹。

    我只想读入部分分区的数据。我有一个指向各个分区的路径列表,如下所示:

    paths_to_files = ['hdfs://data/table_name/2018/10/29',
                      'hdfs://data/table_name/2018/10/30']
    

    然后试着做一些类似的事情:

    df = sqlContext.read.format("parquet").load(paths_to_files)
    

    year, month and day

    我可以使用sql上下文和带有select语句的send配置单元查询,其中的where on year、month和day列只从我感兴趣的分区中选择数据。然而,我宁愿避免用python构建SQL查询,因为我非常懒惰,不喜欢阅读SQL。

    1. 什么是读取存储为拼花地板的数据的最佳方式(性能方面),其中关于年、月、日的信息不存在于拼花地板文件中,而仅包含在文件路径中(使用发送配置单元查询 sqlContext.sql('...') read.parquet
    2. 在使用 我上面概述的方法?
    2 回复  |  直到 6 年前
        1
  •  1
  •   OneCricketeer Gabriele Mariotti    6 年前

    读取当年父目录分区的直接文件路径应该足以让dataframe确定其下是否有分区。但是,如果没有目录结构,它将不知道如何命名分区 /year=2018/month=10

    因此,如果您有配置单元,那么通过元存储将更好,因为分区在那里命名,配置单元存储关于您的表的额外有用信息,并且您不依赖于从Spark代码知道磁盘上文件的直接路径。

    但是,不确定为什么您认为需要读/写SQL。

    df = spark.table("table_name")
    df_2018 = df.filter(df['year'] == 2018)
    df_2018.show() 
    
        2
  •  0
  •   Arnon Rotem-Gal-Oz    6 年前

    您的数据不是以最适合拼花地板的方式存储的,因此您必须逐个加载文件并添加日期

    或者,您可以将文件移动到适合拼花地板的目录结构 然后,您可以读取父目录(表)并按年份、月份和日期进行筛选(spark将只读取相关目录),您还可以在数据框中获取这些属性