Apache spark 从spark shell(pyspark)查询spark流应用程序

Apache spark 从spark shell(pyspark)查询spark流应用程序,apache-spark,pyspark,spark-structured-streaming,Apache Spark,Pyspark,Spark Structured Streaming,我在pyspark控制台中遵循这一点,一切都很完美 之后,我将其作为PySpark应用程序编写,如下所示: -*-编码:utf-8-*- 导入系统 导入点击 导入日志记录 从pyspark.sql导入SparkSession 从pyspark.sql.types导入* @单击.command @单击。选项“-master” 定义最愚蠢的询问者: 火花=火花会话\ 建筑商先生\ 大师先生\ .appNamestream测试\ .getOrCreate spark.sparkContext.setL

我在pyspark控制台中遵循这一点,一切都很完美

之后,我将其作为PySpark应用程序编写,如下所示:

-*-编码:utf-8-*- 导入系统 导入点击 导入日志记录 从pyspark.sql导入SparkSession 从pyspark.sql.types导入* @单击.command @单击。选项“-master” 定义最愚蠢的询问者: 火花=火花会话\ 建筑商先生\ 大师先生\ .appNamestream测试\ .getOrCreate spark.sparkContext.setLogLevel“错误” 一些模式=。。。。删除模式 有火花\ .readStream\ .选项SEP\ .schemasome\u schema\ .选项MaxFilesPertRigger,1\ .csv/data/some_流,header=True 流式处理单元计数= 链接\u stream.groupBysome\u stream.field\u 1.count query=流式处理\u counts.writeStream\ .格式化内存\ .queryNamecounts\ .outputModecomplete\ 开始 查询.等待终止 如果uuuu name uuuuu==\uuuuuuuu main\uuuuuuuu: logging.getLoggerpy4j.setLevellogging.ERROR 最愚蠢的疑问 应用程序的执行方式如下:

spark-submit test_stream.py --master spark://master:7077
现在,如果我在另一个终端中打开一个新的spark驱动程序:

pyspark --master spark://master:7077
并尝试运行:

spark.sql("select * from counts")
它失败于:

During handling of the above exception, another exception occurred:

AnalysisExceptionTraceback (most recent call last)
<ipython-input-3-732b22f02ef6> in <module>()
----> 1 spark.sql("select * from id_counts").show()

/usr/spark-2.0.2/python/pyspark/sql/session.py in sql(self, sqlQuery)
    541         [Row(f1=1, f2=u'row1'), Row(f1=2, f2=u'row2'), Row(f1=3, f2=u'row3')]
    542         """
--> 543         return DataFrame(self._jsparkSession.sql(sqlQuery), self._wrapped)
    544 
    545     @since(2.0)

/usr/local/lib/python3.4/dist-packages/py4j-0.10.4-py3.4.egg/py4j/java_gateway.py in __call__(self, *args)
   1131         answer = self.gateway_client.send_command(command)
   1132         return_value = get_return_value(
-> 1133             answer, self.gateway_client, self.target_id, self.name)
   1134 
   1135         for temp_arg in temp_args:

/usr/spark-2.0.2/python/pyspark/sql/utils.py in deco(*a, **kw)
     67                                              e.java_exception.getStackTrace()))
     68             if s.startswith('org.apache.spark.sql.AnalysisException: '):
---> 69                 raise AnalysisException(s.split(': ', 1)[1], stackTrace)
     70             if s.startswith('org.apache.spark.sql.catalyst.analysis'):
     71                 raise AnalysisException(s.split(': ', 1)[1], stackTrace)

AnalysisException: 'Table or view not found: counts; line 1 pos 14'

我不明白发生了什么。

这是一种预期的行为。如果检查内存接收器:

输出作为内存中的表存储在内存中。同时支持附加和完整输出模式。这应该用于在低数据量上进行调试,因为整个输出都被收集并存储在驱动程序内存中。因此,请谨慎使用

正如您所看到的,内存接收器不创建持久表或全局临时视图,而是创建一个仅限于驱动程序的本地结构。因此,无法从其他Spark应用程序查询它

因此,必须从写入内存的驱动程序中查询内存输出。例如,您可以模拟控制台模式,如下所示

假作家:

作为pd进口熊猫 将numpy作为np导入 导入临时文件 进口舒蒂尔 def产品路径: temp_path=tempfile.mkdtemp def produceri: df=pd.DataFrame{ 组:np.random.randint10,大小=1000 } df[val]= np.random.randn1000+ np.random.random1000*df[组]+ np.random.random1000*i%7 f=tempfile.mktempdir=temp\u路径 df.to_csvf,索引=False shutil.movef,路径 回报生产者 火花应用:

从pyspark.sql.types导入IntegerType、DoubleType、StructType和StructField schema=StructType[ StructFieldgroup,IntegerType, StructFieldval,双重类型 ] path=tempfile.mkdtemp 查询_name=foo stream=spark.readStream schemaschema先生 .csv格式 .optionheader,true .loadpath 查询=流 .groupBygroup 阿夫加尔先生 .writeStream .格式化内存 .queryNamequery\u名称 .outputModecomplete 开始 还有一些活动:

从rx导入可观察 定时器=可观测的。定时器5000,5000 timer.subscribeproducerpath timer.skip1.subscribebelambda*\ uu:spark.tablequery\u name.show 查询.等待终止
回答得很好。谢谢你的解释。只有一个问题是做我想做的事情的正确答案吗?查询将写入拼花地板?在另一个驱动程序中,创建一个时态表?写入文件似乎是一种方法。有定制的foreach接收器,但Python还不支持它。