我正在尝试从Spark RDD执行插入Ignite缓存。我使用的是Ignite的2.2版和Spark的2.1版。
我采取的第一步是在单独的scala脚本中创建缓存,如下所示:
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)
}
}
接下来,我运行了一个Spark应用程序,将igniteRDD的内容插入到缓存中:
ignite_cache_rdd.sql("select * from Custom_Class").show(truncate = false)
可以看出,这些课程完全相同。
成功运行应用程序后,我可以在ignitevisor中看到缓存包含63条记录,可以在控制台的上一个screeshot中看到。
但是,如果我尝试对缓存执行sql查询,如下所示:
% Main function
publish('weeklyReport');
% weeklyReport.m
%% First Section
% This is the first section.
T = array2table(rand(5,3));
结果我得到一张空桌子。
如果我通过外部sql服务器查询,也会发生同样的事情。
奇怪的是,如果我没有创建缓存apriori,并运行Spark应用程序,IgniteContext会创建缓存,如果它不存在,那么我能够在查询中看到记录!< / p>
这可能是什么问题?
据我所知,键和值的数据类型完全相同,所以我应该能够在查询时看到它们。
感谢您的时间。
答案 0 :(得分:5)
这里的问题是您使用不同的类来创建缓存并将数据插入其中。 尽管这两个类的字段匹配,但它们的完全限定名称是不同的,因此这些是两个不同的类。
如果您希望能够从SQL查询数据,则应在缓存创建和数据插入期间使用相同的类。
跳过缓存创建解决问题的原因是Spark应用程序自己创建缓存而不是使用现有缓存。因此,当Spark创建它时,在缓存创建期间使用实际对象的类。