对分区数据进行Spark SQL查询

时间:2015-07-16 12:55:35

标签: apache-spark

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

events
  |---occurredAtYear=2015
  |   |---occurredAtMonth=07
  |   |   |---occurredAtDay=16
  |   |   |   |---<parquet-files>
  ...

然后我从根路径/事件

加载镶木地板文件
sqlContext.parquetFile('/var/tmp/events')

文档说:

  

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

但是我的查询

SELECT * FROM events where occurredAtYear=2015

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

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

干杯

1 个答案:

答案 0 :(得分:7)

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

/var/tmp/occurredAtYear=2015/occurredAtMonth=07/occurredAtDay=16/data.parquet

&quot; data.parquet&#39;另外在下面创建了另一个带有镶木地板文件的目录,我应该将镶木地板文件保存到

/var/tmp/occurredAtYear=2015/occurredAtMonth=07/occurredAtDay=16

现在所有工作都可以正确发现架构。