Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 基于火花流的SQL_Apache Spark_Spark Streaming - Fatal编程技术网

Apache spark 基于火花流的SQL

Apache spark 基于火花流的SQL,apache-spark,spark-streaming,Apache Spark,Spark Streaming,这是在Spark流上运行简单SQL查询的代码 导入org.apache.spark.streaming.{Seconds,StreamingContext} 导入org.apache.spark.streaming.StreamingContext_ 导入org.apache.spark.sql.SQLContext 导入org.apache.spark.streaming.Duration 对象流SQL{ 案例类PersonName:String,年龄:Int def mainargs:数组[

这是在Spark流上运行简单SQL查询的代码

导入org.apache.spark.streaming.{Seconds,StreamingContext} 导入org.apache.spark.streaming.StreamingContext_ 导入org.apache.spark.sql.SQLContext 导入org.apache.spark.streaming.Duration 对象流SQL{ 案例类PersonName:String,年龄:Int def mainargs:数组[字符串]{ val sparkConf=new sparkConf.setMasterlocal.setAppNameHdfsWordCount val sc=新的SparkContextsparkConf //创建上下文 val ssc=新的StreamingContextsc,秒2 val lines=ssc.textFileStreamC:/Users/pravesh.jain/Desktop/people/ lines.foreachRDDrdd=>rdd.foreachprintln val sqc=新的SQLContextsc; 导入sqc.createSchemaRDD //在目录上创建FileInputDStream并使用 //流以计算创建的新文件中的字数 lines.foreachRDDrdd=>{ rdd.map_uu.split.mapp=>Personsp0,p1.trim.toInt.registerAsTabledata
val=sqc.sqlSELECT name FROM data WHERE age>=13和age按照编写代码的方式,每次运行SQL查询时都会生成一系列小schemards。诀窍是将它们保存到累加RDD或累加表中

首先,使用insertInto的表方法:

对于每个流,首先创建一个注册为表的emty RDD,获得一个空表

然后,对于每个查询,使用SchemaRDD的insertInto方法将结果添加到该表中:

teenagers.insertInto("allTeenagers")
如果对两个流都这样做,创建两个单独的累积表,那么就可以使用普通的SQL查询将它们连接起来

注意:我实际上还没能让他工作,稍微搜索一下会让我怀疑其他人是否有,但我很确定我已经理解insertInto的设计意图,所以我认为这个解决方案值得记录

第二,unionAll方法还有一个union方法,但这使得获得正确的类型更加困难:

这涉及到创建一个初始RDD——同样,让我们称之为“所有青少年”

然后,每次:

val teenagers = sqc.sql("SELECT ...")
allTeenagers = allTeenagers.unionAll(teenagers)

也许不用说,您需要列匹配。

好吧,我想总结一下我们在Spiro的回答中讨论后得出的解决方法。他建议先创建一个空表,然后将RDD插入其中。唯一的问题是Spark还不允许插入表中。下面是至少可以这样做:

首先,创建一个RDD,该RDD与您从流中期望的模式相同:

导入sqlContext.createSchemaRDD val d1=sc.parallelizarraya,10,b,3.mape=>Rece.\u 1,e.\u 2 然后将其保存为拼花文件

d1.SaveAsPaquetFile/home/p1.parquet 现在,加载拼花地板文件并使用registerAsTable方法将其注册为表

val parquetFile=sqlContext.parquetFile/home/p1.parquet parquetFile.registerAsTabledata 现在,当您收到流时,只需在流上应用foreachRDD,并在上面使用insertInto方法创建的表中不断插入各个rdd

dStream.foreachRDDrdd=>{ 插入数据 }
此插件工作正常,允许将数据收集到表中。现在,您可以对任意数量的流执行相同的操作,然后运行查询。

感谢您的回复。我尝试了类似var p1=PersonHari,22;val rdd1=sc.parallelizarrayp1;rdd1.registerAsTabledata;var p2=Personsagar,22;var rdd2=sc.parallel的方法Izerarayp2;rdd2.insertIntodata;并获取错误java.lang.AssertionError:assertion失败:没有插入表映射的计划,false似乎我使用insertInto的方式不对?@Pravesh:我也有同样的问题。我非常确定它应该工作,但一些搜索让我怀疑是否有人使用它。我很好奇你得到了什么答复o您在Spark列表上发布的问题。我用第二个解决方案更新了我的答案,我非常确定该解决方案将基于unionAll,我很惊讶还没有人提出这一解决方案。后者的一个简单示例对我来说很好。感谢您提出的宝贵建议。如果您发现新的内容,请随时向我通报。我也会这样做。@Pravesh:您是否已经排除了我回答中的第二个解决方案,unionAll出于某种原因?@Pravesh:我不是建议您将来自不同流的数据收集到一个RDD中,而是将foreachRDD提供给您的RDD片段从每个流收集到一个累加器表/RDD中,从而生成两个表或两个RDD然后,将包含到目前为止来自相应流的所有数据的每个连接起来
val teenagers = sqc.sql("SELECT ...")
allTeenagers = allTeenagers.unionAll(teenagers)