sqlContext.sql返回表,计数为0,pyspark

时间:2017-04-24 11:28:45

标签: pyspark pyspark-sql

我通过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)

还在火花历史记录服务器上查看 - 似乎运行计数的作业没有任何错误,任何可能出错的想法?​​

提前感谢!

2 个答案:

答案 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")