Here,提到我们可以像这样直接在单个文件上运行查询。
df = spark.sql("SELECT * FROM parquet.`examples/src/main/resources/users.parquet`")
我的问题是我们可以对一组分区为yyyy / mm / dd的文件执行此操作吗? 在同一页面上,它说spark可以自动发现分区。我不确定如何针对此类查询执行此操作。
答案 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 |
+---+-----+---+