Zeppelin - 无法使用 %sql 查询我在 pyspark 注册的表
Posted
技术标签:
【中文标题】Zeppelin - 无法使用 %sql 查询我在 pyspark 注册的表【英文标题】:Zeppelin - Cannot query with %sql a table I registered with pyspark 【发布时间】:2016-10-01 06:10:22 【问题描述】:我是 spark/zeppelin 的新手,我想完成一个简单的练习,我将在其中将 csv 文件从 pandas 转换为 Spark 数据帧,然后注册表以使用 sql 查询它并使用 Zeppelin 将其可视化。
但我似乎在最后一步失败了。
我使用的是 Spark 1.6.1
这是我的代码:
%pyspark
spark_clean_df.registerTempTable("table1")
print spark_clean_df.dtypes
print sqlContext.sql("select count(*) from table1").collect()
这是输出:
[('id', 'bigint'), ('name', 'string'), ('host_id', 'bigint'), ('host_name', 'string'), ('neighbourhood', 'string'), ('latitude', 'double'), ('longitude', 'double'), ('room_type', 'string'), ('price', 'bigint'), ('minimum_nights', 'bigint'), ('number_of_reviews', 'bigint'), ('last_review', 'string'), ('reviews_per_month', 'double'), ('calculated_host_listings_count', 'bigint'), ('availability_365', 'bigint')]
[Row(_c0=4961)]
但是当我尝试使用 %sql 时,我得到了这个错误:
%sql
select * from table1
Table not found: table1; line 1 pos 14
set zeppelin.spark.sql.stacktrace = true to see full stacktrace
任何帮助将不胜感激 - 我什至不知道在哪里可以找到这个堆栈跟踪以及它如何帮助我。
谢谢:)
【问题讨论】:
这个链接在处理这个问题时特别有用:spark.apache.org/docs/latest/sql-programming-guide.html 【参考方案1】:Zeppelin 可以为不同的解释器创建不同的上下文,如果您使用 %spark 执行一些代码和使用 %pyspark 解释器执行一些代码,那么您的 Zeppelin 可能有两个上下文。当你使用 %sql 时,它会在另一个上下文中查找,而不是在 %pyspark 中。 尝试重新启动 Zeppelin 并执行 %pyspark 代码作为第一条语句,然后执行 %sql 作为第二条语句。
如果您转到“解释器”选项卡,您可以在那里添加 zeppelin.spark.sql.stacktrace。重新启动 Zeppelin 后,您将在现在“找不到表”的地方看到完整的堆栈跟踪。
实际上这可能是您问题的答案 When registering a table using the %pyspark interpreter in Zeppelin, I can't access the table in %sql
试着去做
%pyspark
sqlContext = sqlc
前两行
【讨论】:
嗨,谢谢你的建议,但我认为这不是我想要的。我进一步测试了可能是什么问题并提出了这个解决方案:我需要首先创建新表的架构,根据架构创建一个空表并逐列解析数据框,然后从在我注册之前将 data.frame 转换为 sql 表。否则我注册的是空的。很烦人,而且使用起来不太友好......我发现更容易的是使用 matplotlib 可视化数据,而不是将表注册为 sql 来查询它并使用 Zeppelins 可视化。【参考方案2】:还与 spark 创建的不同上下文相关检查 spark 解释器中的以下设置
zeppelin.spark.useHiveContext = false
将设置设为“假”
【讨论】:
【参考方案3】:您没有说明您使用的是哪个解释器组。如果是livy
,那么您无法从%livy.sql
访问在%livy.pyspark
中注册的表。我从here 得到这个:
for now %livy.sql can only access tables registered %livy.spark, but not %livy.pyspark and %livy.sparkr.
如果您切换到标准的spark
解释器组,它应该可以工作。我可以使用 Spark 1.6.3 和 Zeppelin 0.7.0 为我确认这一点。希望在 livy 解释器上工作的人能够解决这个限制......
【讨论】:
据我所知,没有 %livy.pyspark 解释器。不幸的是,我无法再使用这台机器了,所以我无法确定。无论如何感谢您的提示和链接!【参考方案4】:正确的语法是:
sqlContext.registerDataFrameAsTable(spark_clean_df, 'table1')
sqlContext.sql(select * from table1 where ...)
【讨论】:
以上是关于Zeppelin - 无法使用 %sql 查询我在 pyspark 注册的表的主要内容,如果未能解决你的问题,请参考以下文章
Zeppelin:使用 SQL 查询数据并使用它的最佳方法是啥?
保存/导出 Spark SQL Zeppelin 查询的结果
sql 查询在 zeppelin 中转换为 spark lang
从 Apache Zeppelin 对 AWS Athena 运行时,SQL 查询将永远运行