簡體   English   中英

SQL查詢針對Apache Ignite緩存返回空結果

[英]SQL query returns empty result for Apache Ignite cache

我正在嘗試從Spark RDD向Ignite緩存執行插入操作。 我正在使用2.2版本的Ignite和2.1版本的Spark。

我要做的第一步是在單獨的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()
}
}

從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查詢,如下所示:

      ignite_cache_rdd.sql("select * from Custom_Class").show(truncate = false)

結果我得到一個空表。

如果我通過外部sql服務器查詢,也會發生同樣的事情。

奇怪的是,如果我不創建緩存先驗,而是運行Spark應用程序,則IgniteContext將創建緩存(如果該緩存不存在), 然后我就可以在查詢中看到記錄!

這可能是什么問題?

據我所知,鍵和值的數據類型完全相同,因此我在查詢時應該能夠看到它們。

感謝您的時間。

這里的問題是您使用不同的類來創建緩存並將數據插入到其中。 即使這兩個類的字段匹配,它們的完全限定名稱也不同,因此它們是兩個不同的類。

如果希望能夠從SQL查詢數據,則應在緩存創建和數據插入期間使用同一類。

跳過創建緩存解決了問題的原因是Spark應用程序自己創建了一個緩存,而不是使用現有緩存。 因此,當Spark創建它時,將在創建緩存時使用實際對象的類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM