使用Pyspark

时间:2018-11-03 00:32:33

标签: sql pyspark

Here,提到我们可以像这样直接在单个文件上运行查询。

df = spark.sql("SELECT * FROM parquet.`examples/src/main/resources/users.parquet`")

我的问题是我们可以对一组分区为yyyy / mm / dd的文件执行此操作吗? 在同一页面上,它说spark可以自动发现分区。我不确定如何针对此类查询执行此操作。

1 个答案:

答案 0 :(得分:1)

如果您有一个镶木桌子,且其中嵌套了partition fields yyyy/mm/dd然后在查询中提供表位置目录,然后spark可以读取所有嵌套分区并创建数据框

示例:

我有一个包含3个分区字符串字段(年,月,日)的表

hive> desc i;

+--------------------------+-----------------------+-----------------------+--+
|         col_name         |       data_type       |        comment        |
+--------------------------+-----------------------+-----------------------+--+
| id                       | int                   |                       |
| year                     | string                |                       |
| month                    | string                |                       |
| dd                       | string                |                       |
|                          | NULL                  | NULL                  |
| # Partition Information  | NULL                  | NULL                  |
| # col_name               | data_type             | comment               |
|                          | NULL                  | NULL                  |
| year                     | string                |                       |
| month                    | string                |                       |
| dd                       | string                |                       |
+--------------------------+-----------------------+-----------------------+--+

现在,我正在尝试通过读取镶木地板文件(表位置为/apps/hive/warehouse/i)来加载数据。

HDFS中的文件

hadoop fs -ls -R /apps/hive/warehouse/i
drwxrwxrwt   - hive hadoop          0 2018-11-03 00:10 /apps/hive/warehouse/i/year=2018
drwxrwxrwt   - hive hadoop          0 2018-11-03 00:10 /apps/hive/warehouse/i/year=2018/month=10
drwxrwxrwt   - hive hadoop          0 2018-11-03 00:10 /apps/hive/warehouse/i/year=2018/month=10/dd=15
-rwxrwxrwt   3 hive hadoop        214 2018-11-03 00:10 /apps/hive/warehouse/i/year=2018/month=10/dd=15/000000_0

现在从pyspark中读取数据:

>>> df=spark.sql("select * from parquet.`/apps/hive/warehouse/i`")
>>> df.columns
['id', 'year', 'month', 'dd']
>>> df.show(10,False)
+---+----+-----+---+
|id |year|month|dd |
+---+----+-----+---+
|1  |2018|10   |15 |
+---+----+-----+---+

如果您只想读取特定年份的文件,则

>>> df=spark.sql("select * from parquet.`/apps/hive/warehouse/i/year=2018`")
>>> df.columns
['id', 'month', 'dd']
>>> df.show(10,False)
+---+-----+---+
|id |month|dd |
+---+-----+---+
|1  |10   |15 |
+---+-----+---+

没有年份的列,因为我们不使用pyspark读取年份数据,而我们是实木复合地板文件中的reading only the month,dd and id fields数据。

  

更新:

对于csv文件,我们可以遵循similar approach as above,并且我们不需要year,month,day字段,因为 spark将在读取目录中的数据时创建这些字段。

读取CSV文件:

#we are reading the csv files with header  
>>> spark.sql("""CREATE OR REPLACE TEMPORARY view df
             USING csv 
             OPTIONS (header "true", path "/apps/hive/warehouse/i")""")

>>> df=spark.sql("select * from df")
>>> df.show(10,False)
+---+-----+---+
|id |month|dd |
+---+-----+---+
|1  |10   |15 |
+---+-----+---+