对分区数据进行Spark SQL查询

vce*_*ick 1 apache-spark

我已经设置了一个收集事件数据的Spark 1.3.1应用程序.其中一个属性是名为'occurrence'的时间戳.我打算将事件数据划分为文件存储区中的镶木地板文件,并根据文档(https://spark.apache.org/docs/1.3.1/sql-programming-guide.html#partition-discovery)表示基于时间的值不仅仅支持string和int,所以我将日期分为Year,Month,Day值并按如下方式分区

events
  |---occurredAtYear=2015
  |   |---occurredAtMonth=07
  |   |   |---occurredAtDay=16
  |   |   |   |---<parquet-files>
  ...
Run Code Online (Sandbox Code Playgroud)

然后我从根路径/事件加载镶木地板文件

sqlContext.parquetFile('/var/tmp/events')
Run Code Online (Sandbox Code Playgroud)

文件说:

'Spark SQL将自动从路径中提取分区信息'

但是我的查询

SELECT * FROM events where occurredAtYear=2015
Run Code Online (Sandbox Code Playgroud)

悲惨地说火花无法解决'happenAtYear'

我可以看到事件的所有其他方面的模式,并可以对这些属性进行查询,但printSchema根本没有列出schemaAtYear/Month/Day?我错过了让分区正常工作的原因.

干杯

vce*_*ick 7

所以事实证明我按照说明过于精确,实际上我正在编写镶木地板文件

/var/tmp/occurredAtYear=2015/occurredAtMonth=07/occurredAtDay=16/data.parquet
Run Code Online (Sandbox Code Playgroud)

'data.parquet'还在下面创建了一个带有镶木地板文件的另一个目录,我应该将镶木地板文件保存到

/var/tmp/occurredAtYear=2015/occurredAtMonth=07/occurredAtDay=16
Run Code Online (Sandbox Code Playgroud)

现在所有工作都正确地发现了架构.