Apache spark 从spark shell(pyspark)查询spark流应用程序
我在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 最愚蠢的疑问 应用程序的执行方式如下: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
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还不支持它。