我创建了一个简单的Avro(1.7.7)模式,让Avro生成我的Java类,这些类被激活并添加到我的Spark项目中。在生成的java类中,我有:
{
"namespace": "com.rbh.avro.metric",
"type": "record",
"name": "Metric",
"fields": [
{ "name": "consumerId", "type": "long" },
{
"name": "data",
"type": {
"name": "Data",
"type": "record",
"fields": [
{ "name": "name", "type": "string" },
{ "name": "attributes",
"type": {
"type": "array",
"items": {
"type": "map",
"values": "string"
}
}
}
]
}
}
]
}
作为从模式创建的代码的一部分,如下所示:
String
因此,由于CharSequence
是val data:Data = Data.newBuilder.setName("myData").build
val x = Map("a" -> "1", "b" -> "2", "c" -> "3").asJava
val y = Map("x" -> "42", "y" -> "27", "z" -> "-1").asJava
val z = Map("g" -> "a", "h" -> "*", "i" -> "~").asJava
val xyz = List(x,y,z).asJava
data.setAttributes(xyz)
,我测试的部分代码如下所示:
[error] /home/bkarels/dev/spark/event-gen/src/main/scala/com/rbh/generator/Generator.scala:60: type mismatch;
[error] found : java.util.List[java.util.Map[String,String]]
[error] required: java.util.List[java.util.Map[CharSequence,CharSequence]]
[error] data.setAttributes(xyz)
[error] ^
[warn] 5 warnings found
[error] one error found
[error] (compile:compileIncremental) Compilation failed
[error] Total time: 11 s, completed Jun 26, 2015 8:12:31 AM
Eclipse立即抱怨并在编译时(Scala 2.10.5& SBT 0.13.8)我看到了:
scala> def foo(cs:CharSequence) = {
| println(cs)}
foo: (cs: CharSequence)Unit
scala> def s:String = "bar"
s: String
scala> foo(s)
bar
开始我的困惑......
所以,我打开了一个REPL会话,这很有效:
val data:Data = Data.newBuilder.setName("myData").build
val cs0:CharSequence = "xxx"
val w = Map(cs0 -> cs0).asJava
val wl = List(w).asJava
data.setAttributes(wl)
我还要进行某种验证,将此代码放入其中并按预期编译和运行:
fc-content
正如人们所预料的那样,这种笨拙的冗长并不是一个解决方案"有翅膀......
所以有些不对劲,但我不知道它会是什么。如果您有想法,请告诉我 - 谢谢。
答案 0 :(得分:1)
Map[String, String]
不是Map[CharSequence, CharSequence]
,因为Map[CharSequence, CharSequence]
允许添加非String
的键/值对。请参阅此SO question以获得出色的答案。
答案 1 :(得分:0)
我在Java中也遇到了这个问题,同时从avroschema生成POJO,其中变量是使用CharSequence为所有字符串声明创建的。正如上面的评论中所提到的,CharSequence是一个接口和String实现。因此,String值的直接赋值总是失败。我正在使用一个笨拙的快速解决方案,使用.toString()来获取值的String。
在Google上搜索时,碰巧看到有一个maven-compiler标签,它将字符串转换为字符串,现在我可以完全忘记从avro架构创建的POJO中的CharSequence。不确定SBT如何能够提供此功能