我已经设置了一个收集事件数据的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?我错过了让分区正常工作的原因。
干杯
答案 0 :(得分:7)
所以事实证明我按照说明过于精确,实际上我正在将镶木地板文件写到
/var/tmp/occurredAtYear=2015/occurredAtMonth=07/occurredAtDay=16/data.parquet
&quot; data.parquet&#39;另外在下面创建了另一个带有镶木地板文件的目录,我应该将镶木地板文件保存到
/var/tmp/occurredAtYear=2015/occurredAtMonth=07/occurredAtDay=16
现在所有工作都可以正确发现架构。