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 查询将永远运行

如何让 Zeppelin 在 EMR 集群上干净地重新启动?

将 Zeppelin 与外部 javascript 工具一起使用,例如 plotly