我通过pyspark
交互式shell使用EMR运行了一个spark应用程序。
我尝试连接到一个名为: content_publisher_events_log 的hive表,我知道它不是空的(通过我的hue控制台使用完全相同的查询),但是我尝试通过pyspark读取它我得到计数= 0如下:
from pyspark.sql import HiveContext
Query=""" select dt
from default.content_publisher_events_log
where dt between '20170415' and '20170419'
"""
hive_context = HiveContext(sc)
user_data = hive_context.sql(Query)
user_data.count()
0 #that's the result
此外,从控制台我可以看到该表存在:
>>> sqlContext.sql("show tables").show()
+--------+--------------------+-----------+
|database| tableName|isTemporary|
+--------+--------------------+-----------+
| default|content_publisher...| false|
| default| feed_installer_log| false|
| default|keyword_based_ads...| false|
| default|search_providers_log| false|
+--------+--------------------+-----------+
>>> user_data.printSchema()
root
|-- dt: string (nullable = true)
还在火花历史记录服务器上查看 - 似乎运行计数的作业没有任何错误,任何可能出错的想法?
提前感谢!
答案 0 :(得分:1)
dt列不是日期时间格式。要么正确地将列本身更改为具有日期时间格式,要么将查询本身更改为将字符串转换为时间戳
Query=""" select dt
from default.content_publisher_events_log
where dt between
unix_timestamp('20170415','yyyyMMdd') and
unix_timestamp('20170419','yyyyMMdd')
"""
答案 1 :(得分:0)
似乎我们的数据团队将每个分区的镶木地板文件移动到子文件夹中,他们修复了它并从4月25日开始它完美地工作。
据我所知,如果有人面对这个问题,请尝试这样的事情:
sqlContext.sql("SET hive.mapred.supports.subdirectories=true")
sqlContext.sql("SET mapreduce.input.fileinputformat.input.dir.recursive=true")
或者这个:
sc._jsc.hadoopConfiguration().set("mapreduce.input.fileinputformat.input.dir.recursive","true")