Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.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
SQL查询返回Apache Ignite缓存的空结果_Sql_Scala_Apache Spark_Caching_Ignite - Fatal编程技术网

SQL查询返回Apache Ignite缓存的空结果

SQL查询返回Apache Ignite缓存的空结果,sql,scala,apache-spark,caching,ignite,Sql,Scala,Apache Spark,Caching,Ignite,我正在尝试从Spark RDD向Ignite缓存执行插入。我使用的是Ignite的2.2版和Spark的2.1版 我采取的第一步是在单独的scala脚本中创建缓存,如下所示: object Create_Ignite_Cache { case class Custom_Class( @(QuerySqlField @field)(index = true) a: String, @(QuerySqlField @f

我正在尝试从Spark RDD向Ignite缓存执行插入。我使用的是Ignite的2.2版和Spark的2.1版

我采取的第一步是在单独的scala脚本中创建缓存,如下所示:

object Create_Ignite_Cache {

case class Custom_Class(
                   @(QuerySqlField @field)(index = true)   a: String,
                   @(QuerySqlField @field)(index = true)  b: String,
                   @(QuerySqlField @field)(index = true)  c: String,
                   @(QuerySqlField @field)(index = true)  d: String,
                   @(QuerySqlField @field)(index = true)  e: String,
                   @(QuerySqlField @field)(index = true)  f: String,
                   @(QuerySqlField @field)(index = true)  g: String,
                   @(QuerySqlField @field)(index = true)  h: String

                 )
def main(args: Array[String]): Unit = {
 val spi = new TcpDiscoverySpi
 val ipFinder = new TcpDiscoveryMulticastIpFinder
 val adresses = new util.ArrayList[String]
 adresses.add("127.0.0.1:48500..48520")
 ipFinder.setAddresses(adresses)
 spi.setIpFinder(ipFinder)
 val cfg = new IgniteConfiguration().setDiscoverySpi(spi).setClientMode(true)
 val cache_conf = new CacheConfiguration[String, Custom_Class]().setCacheMode(CacheMode.PARTITIONED).setAtomicityMode(CacheAtomicityMode.ATOMIC).setBackups(1).setIndexedTypes(classOf[String], classOf[Custom_Class]).setName("Spark_Ignite")
 val ignite = Ignition.getOrStart(cfg)
 ignite.getOrCreateCache(cache_conf)
 System.out.println("[INFO] CACHE CREATED")
 ignite.close()
}
}
      ignite_cache_rdd.sql("select * from Custom_Class").show(truncate = false)
缓存已成功创建,从ignitevisor可以看出:

接下来,我运行了一个Spark应用程序,将igniteRDD的内容插入缓存:

object Spark_Streaming_Processing {

 case class Custom_Class(
                      @(QuerySqlField @field)(index = true) a: String,
                      @(QuerySqlField @field)(index = true) b: String,
                      @(QuerySqlField @field)(index = true) c: String,
                      @(QuerySqlField @field)(index = true) d: String,
                      @(QuerySqlField @field)(index = true) e: String,
                      @(QuerySqlField @field)(index = true) f: String,
                      @(QuerySqlField @field)(index = true) g: String,
                      @(QuerySqlField @field)(index = true) h: String

                    )

   //START IGNITE CONTEXT

  val addresses=new util.ArrayList[String]()
  addresses.add("127.0.0.1:48500..48520")

  val igniteContext:IgniteContext=new IgniteContext(sqlContext.sparkContext,()=>
    new IgniteConfiguration().setDiscoverySpi(new TcpDiscoverySpi().setIpFinder(new TcpDiscoveryVmIpFinder().setAddresses(addresses))
      ).setCacheConfiguration(new CacheConfiguration[String,Custom_Class]()
      .setName("Spark_Ignite").setBackups(1).setIndexedTypes(classOf[String],classOf[Custom_Class]))
    ,true)


  println(igniteContext.ignite().cacheNames())

  val ignite_cache_rdd:IgniteRDD[String,Custom_Class] =igniteContext.fromCache[String,Custom_Class]("Spark_Ignite")

  val processed_Pair:RDD[(String,Custom_Class)]=(...)// rdd with data, which as you can see has the correct datatypes as parameters

  ignite_cache_rdd.savePairs(processed_PairRDD)

}
  }
可以看出,这些类是完全相同的

在成功运行应用程序后,我可以在ignitevisor中看到缓存包含63条记录,这可以在控制台的上一个屏幕显示中看到

但是,如果我尝试对缓存执行sql查询,如下所示:

object Create_Ignite_Cache {

case class Custom_Class(
                   @(QuerySqlField @field)(index = true)   a: String,
                   @(QuerySqlField @field)(index = true)  b: String,
                   @(QuerySqlField @field)(index = true)  c: String,
                   @(QuerySqlField @field)(index = true)  d: String,
                   @(QuerySqlField @field)(index = true)  e: String,
                   @(QuerySqlField @field)(index = true)  f: String,
                   @(QuerySqlField @field)(index = true)  g: String,
                   @(QuerySqlField @field)(index = true)  h: String

                 )
def main(args: Array[String]): Unit = {
 val spi = new TcpDiscoverySpi
 val ipFinder = new TcpDiscoveryMulticastIpFinder
 val adresses = new util.ArrayList[String]
 adresses.add("127.0.0.1:48500..48520")
 ipFinder.setAddresses(adresses)
 spi.setIpFinder(ipFinder)
 val cfg = new IgniteConfiguration().setDiscoverySpi(spi).setClientMode(true)
 val cache_conf = new CacheConfiguration[String, Custom_Class]().setCacheMode(CacheMode.PARTITIONED).setAtomicityMode(CacheAtomicityMode.ATOMIC).setBackups(1).setIndexedTypes(classOf[String], classOf[Custom_Class]).setName("Spark_Ignite")
 val ignite = Ignition.getOrStart(cfg)
 ignite.getOrCreateCache(cache_conf)
 System.out.println("[INFO] CACHE CREATED")
 ignite.close()
}
}
      ignite_cache_rdd.sql("select * from Custom_Class").show(truncate = false)
结果我得到了一张空桌子

如果通过外部sql server进行查询,也会发生同样的情况

奇怪的是,如果我不先创建缓存,然后运行Spark应用程序,则IgniteContext会在缓存不存在时创建缓存,然后我可以在查询中看到记录

这里可能有什么问题

据我所知,键和值的数据类型完全相同,因此我应该能够在查询时看到它们


谢谢您的时间。

这里的问题是您使用不同的类来创建缓存并将数据插入其中。 尽管这两个类的字段匹配,但它们的完全限定名是不同的,因此这是两个不同的类

如果希望能够从SQL查询数据,则应在缓存创建和数据插入期间使用相同的类


跳过缓存创建可以解决问题的原因是Spark应用程序自己创建缓存,而不是使用现有的缓存。所以,当Spark创建它时,实际对象的类将在缓存创建期间使用。

Hmm,我明白你的意思,所以如果我想将插入与缓存创建分开,你认为将原始类(作为jar)添加到我的项目库中,然后在Spark脚本中调用它可以解决问题吗?或者它会有一个不同的完全限定名吗?@manuelmourato如果你有一个带有模型类的jar,并且你在创建缓存和插入数据时使用它,那么它会工作得非常好。太棒了,非常感谢你的帮助:)