PySpark org.apache.spark.sql.AnalysisException:未找到表或视图:

时间:2018-07-22 14:26:07

标签: python apache-spark twitter pyspark

我遇到的问题与许多其他有关PySpark的问题类似,但是这些解决方案似乎都不适合我的问题,因此我要发布一个新问题。

我正在按照本教程https://github.com/emiljdd/Tweepy-SparkTwitterI进行操作,但似乎无法使第二阶段的步骤7正常工作。

运行此代码:

count = 0
while count < 10:

 time.sleep( 3 )
 top_10_tweets = sqlContext.sql( 'Select tag, count from tweets' )
 top_10_df = top_10_tweets.toPandas() # Dataframe library
 display.clear_output(wait=True) #Clears the output, if a plot exists.
 sns.plt.figure( figsize = ( 10, 8 ) )
 sns.barplot( x="count", y="tag", data=top_10_df)
 sns.plt.show()
 count = count + 1

我收到以下错误:

Py4JJavaError: An error occurred while calling o24.sql.
: org.apache.spark.sql.AnalysisException: Table or view not found: tweets; line 1 pos 23
    at org.apache.spark.sql.catalyst.analysis.package$AnalysisErrorAt.failAnalysis(package.scala:47)
    at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$.org$apache$spark$sql$catalyst$analysis$Analyzer$ResolveRelations$$lookupTableFromCatalog(Analyzer.scala:665)
    at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$.resolveRelation(Analyzer.scala:617)
    at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$$anonfun$apply$8.applyOrElse(Analyzer.scala:647)
    at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$$anonfun$apply$8.applyOrElse(Analyzer.scala:640)...

我当然可以发布更多代码(如果有帮助的话),但实际上,我只是在遵循本教程,没有任何更改。

第一阶段的流媒体设置看起来不错,因为我可以看到发送了Tweets。

有什么建议吗?

谢谢!

4 个答案:

答案 0 :(得分:1)

我猜没有创建像tempview这样的数据框。您必须使用“ tweets”临时视图名称创建数据框。示例代码为:

dataFrame.createOrReplaceTempView("tweets")

请检查您的代码中是否包含此创建内容。

答案 1 :(得分:0)

有关此https://github.com/emiljdd/Tweepy-SparkTwitterI/issues/5

的问题,在github问题页面上已回答

问题是该代码行中该教程的第4步

( lines.flatMap( lambda text: text.split( " " ) ) 
             .filter( lambda word: word.lower().startswith("#") ) 
             .map( lambda word: ( word.lower(), 1 ) ) 
             .reduceByKey( lambda a, b: a + b ) 
             .map( lambda rec: Tweet( rec[0], rec[1] ) ) 
             ##.foreachRDD( lambda rdd: rdd.toDF().sort( desc("count") # the desc here doesnt work with 
             .foreachRDD( lambda rdd: rdd.toDF().sort("count")      
             .limit(10).registerTempTable("tweets") ) )

删除排序中的desc,它应该可以工作。它不会引发异常,但应该

答案 2 :(得分:0)

问题可能是->
1.您的火花默认值是纱线,将其更改为本地模式。

2。只有一个执行器正在工作,正在接收消息,但是没有执行器正在处理消息。

解决方案: 在打开jupyter时,请遵循以下命令。(确保pyspark2默认在jupyter中打开)

[cloudera @ quickstart〜] $ pyspark2 --master local [2]

这应该可以解决您的问题。

答案 3 :(得分:0)

问题可能出在SPARK版本与您的SQLContext代码不兼容。

我对代码进行了一些更改,并使它可以正常工作。

第一步: 从Sql函数导入Spark Session

from pyspark.sql import SparkSession,SQLContext

第2步: 创建了一个Spark Sql会话:

spark = SparkSession.builder.appName('Sparksql').getOrCreate()

Step3: 代替registerTempTable,使用createOrReplaceTempView: .limit(10).createOrReplaceTempView("tweets")

Step4: 检查Sql是否按以下方式工作:

top_10_tweets = spark.sql( 'Select tag, count from tweets' )
top_10_tweets.show()

请让我们知道您的情况。