使用spark查询配置单元表

m3eecexj  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(492)

我是apache hive和spark的新手。我的hadoop服务器上有一些现有的hive表,我可以运行一些hql命令,并使用hive或beeline从表中获取所需的内容,例如,选择表的前5行。相反,我想用spark来实现同样的目标。我在服务器上的spark版本是1.6.3。
使用以下代码(我将数据库名称和表替换为数据库和表):

sc = SparkContext(conf = config)
sqlContext = HiveContext(sc)

query = sqlContext.createDataFrame(sqlContext.sql("SELECT * from database.table LIMIT 5").collect())
df = query.toPandas()
df.show()

我得到这个错误:

ValueError: Some of types cannot be determined after inferring.  
Error:root: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line string', (1, 0))

但是,我可以对相同的查询使用beeline并查看结果。
经过一天的谷歌搜索,我修改了代码为:

table_ccx = sqlContext.table("database.table")
table_ccx.registerTemplate("temp")
sqlContext.sql("SELECT * FROM temp LIMIT 5").show()

现在错误消失了,但是除了一个或两个日期和列名之外,所有的行值都是空的。
我也试过了

table_ccx.refreshTable("database.table")

但这没用。是否有需要我的it团队执行的设置或配置?谢谢你的帮助。
edit:说到这里,我的python代码正在为hadoop上的一些表工作。不知道问题是不是因为表上有些条目?如果是,那么相应的beeline/hive命令是如何工作的?

6tr1vspr

6tr1vspr1#

正如评论中提到的,稍微理顺一下代码就可以让事情正常进行。
问题出在这行代码上:

query = sqlContext.createDataFrame(sqlContext.sql("SELECT * from database.table LIMIT 5").collect())

你在这里做的是:
请求spark查询数据源(创建 DataFrame ) collect 所有关于司机的资料都是本地收集的
将spark上的本地集合与 createDataFrame 一般来说,这种方法应该是可行的,尽管它显然是不必要的复杂。
以下操作将完成:

query = sqlContext.sql("SELECT * from database.table LIMIT 5")

我不完全清楚为什么这个东西会破坏你的代码,但它仍然会破坏你的代码(正如评论中所说的那样),而且它还改进了你的代码。

相关问题