我有以下代码: -
case class event(imei: String, date: String, gpsdt: String,
entrygpsdt: String,lastgpsdt: String)
val result = rdd.map(row => {
val imei = row.getString(0)
val date = row.getString(1)
val gpsdt = row.getString(2)
event(imei, date, gpsdt, lastgpsdt ,"2018-04-06 10:10:10")
}).collect()
val collection = sc.parallelize(result)
collection.saveToCassandra("db", "table", SomeColumns("imei", "date", "gpsdt", "lastgpsdt", "dt")
这很好用。所以,现在我将这个结果值插入到cassandra中,但我想将每个rdd的一部分插入到Redis中。当我试图在内部循环中使用redis insert时,它会给出一个错误,即Task不可序列化
我想要这样的事情: -
case class event(imei: String, date: String, gpsdt: String,
entrygpsdt: String,lastgpsdt: String)
val result = rdd.map(row => {
val imei = row.getString(0)
val date = row.getString(1)
val gpsdt = row.getString(2)
val zscore = Calendar.getInstance().getTimeInMillis
val value = row.getString(0) + ',' + row.getString(2)
val key = row.getString(1)
client.zadd(key , zscore, value)
event(imei, date, gpsdt, lastgpsdt ,"2018-04-06 10:10:10")
}).collect()
val collection = sc.parallelize(result)
collection.saveToCassandra("db", "table", SomeColumns("imei", "date", "gpsdt", "lastgpsdt", "dt")
那么,我怎么能这样做,“客户端”是scala redis库的对象。 谢谢,
答案 0 :(得分:0)
由于没有人提供任何答案。我为我的案子找到了解决方案。不知道这种方法是否好,但它对我有用。因此,想法是通过迭代RDD来收集数据。您将获得Array [event]的结果。所以,现在再次启动结果循环并在Redis中插入每一行。最后在卡桑德拉“结果”。这个流程正在解决我正在寻找的两个目的。 谢谢,
答案 1 :(得分:0)
serializable
异常通常是由于创建连接对象引起的。
但是您的代码不包含,我猜您已在client
foreachRDD
对象
如果是,则驱动程序中的客户端对象为created
,而foreach
中的executor
执行client
,无法找到task not serializable.
对象并发生异常client
< / p>
您可以在foreach
内创建connection
对象,但这会为每个record
创建rdd.foreachPartition(partition => {
//Create a connection here for redis
partition.foreach(record => {
//send the data here
})
})
,这对性能也不利。
所以你可以做的是
constructor(props) {
super(props);
this.state = { disabled: false }
}
clicky(e) {
//should dictate the toggle logic
}
render () {
<div onClick={this.clicky.bind(this)}>
<button disabled={this.state.disabled}>Item 1</button>
<button disabled={this.state.disabled}>Item 2</button>
</div>
}
希望这有帮助!