PySpark创建DataFrame写入Hive表后读取结果不符问题求助
问题分析与解决方法
兄弟,我一眼就瞅出你代码里的问题啦!咱们一步步来捋:
问题根源
你定义的cntl_dt = [('2016-04-30')]这里有个小坑——括号里的内容没加逗号,这就不是元组,只是个被括号包起来的字符串而已!所以这个列表里的元素其实是'2016-04-30',不是你以为的单元素元组。
接下来到rdd.map(lambda x: Row(load_dt=x[0]))这一步,x是字符串'2016-04-30',x[0]取的是字符串的第一个字符'2',所以写入Hive表的load_dt字段值自然就是'2',读取出来肯定是2,完全不符合你要的日期。
修正后的代码
给你两种修正方案,任选其一就行:
方案一:用单元素元组列表(推荐,符合Spark创建DataFrame的常规写法)
sqlContext = HiveContext(sc) hive_context = HiveContext(sc) #Initialize Hive # 关键修正:加个逗号让它变成元组 cntl_dt = [('2016-12-31',)] rdd = sc.parallelize(cntl_dt) row_cntl_dt = rdd.map(lambda x: Row(load_dt=x[0])) df_cntl_dt = sqlContext.createDataFrame(row_cntl_dt) # 写入Hive表 df_cntl_dt.write.mode("overwrite").saveAsTable("schema.cntrl_tbl") # 读取并打印结果 load_dt = hive_context.sql("select load_dt from schema.cntrl_tbl" ).first()['load_dt'] print(load_dt)
方案二:直接用字符串列表,调整map逻辑
sqlContext = HiveContext(sc) hive_context = HiveContext(sc) #Initialize Hive cntl_dt = ['2016-12-31'] rdd = sc.parallelize(cntl_dt) # 关键修正:直接用x,不用取x[0] row_cntl_dt = rdd.map(lambda x: Row(load_dt=x)) df_cntl_dt = sqlContext.createDataFrame(row_cntl_dt) df_cntl_dt.write.mode("overwrite").saveAsTable("schema.cntrl_tbl") load_dt = hive_context.sql("select load_dt from schema.cntrl_tbl" ).first()['load_dt'] print(load_dt)
这样修改后,写入表的就是完整的日期字符串,读取出来就是你预期的2016-12-31啦!
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

