Scala 如何逃离';是保留关键字,不能用作字段名';Spark SQL和结构化流媒体出错?;
当前,当我使用Structured Streaming v2.1.0+Kafka v0.10进行实时日志处理时,我在线程“main”java.lang.UnsupportedOperationException中遇到异常:`package`是保留关键字,不能用作字段名 我的任务需要两个逻辑部分: 第一部分。通过net.liftweb.json将包含一些json fromat字符串的日志消息转换为相应的case类 我的一个案例类定义如下:Scala 如何逃离';是保留关键字,不能用作字段名';Spark SQL和结构化流媒体出错?;,scala,apache-spark,apache-spark-sql,spark-structured-streaming,lift-json,Scala,Apache Spark,Apache Spark Sql,Spark Structured Streaming,Lift Json,当前,当我使用Structured Streaming v2.1.0+Kafka v0.10进行实时日志处理时,我在线程“main”java.lang.UnsupportedOperationException中遇到异常:`package`是保留关键字,不能用作字段名 我的任务需要两个逻辑部分: 第一部分。通过net.liftweb.json将包含一些json fromat字符串的日志消息转换为相应的case类 我的一个案例类定义如下: case class Mobile(val title:
case class Mobile(val title: Option[String],
val desc: Option[String],
val adtype: Option[Int],
val apkname: Option[String],
@transient val `package`: Option[String],
val appstoreid: Option[String]
) extends java.io.Serializable
第二部分。使用结构化流媒体v2.1.0+卡夫卡v0.10进行实时处理:
val spark: SparkSession = SparkSession.
builder().
appName("structured streaming test").
getOrCreate()
val df = spark.
readStream.
format("kafka").
option("kafka.bootstrap.servers", "localhost:9092").
option("subscribe", "stream1").
option("maxOffsetPerTrigger", "10000").
load()
import spark.implicits._
val ds = df.
//change the value's type from binary to STRING
selectExpr("CAST(value AS STRING)").
as[String].
map(myLogicToProcessLogs)
val query = ds.
writeStream.
outputMode("append").
// format("console").
trigger(ProcessingTime("10 seconds")).
foreach(new HttpSink).
start()
query.awaitTermination()
我得到的错误原因是,我的日志消息包含一些java保留关键字,如“package”,Spark SQL编码器总是失败
注意:通过使用“package”来逃避scala关键字检查,并使用@transient关键字来逃避java序列化,我可以成功地将上面的case类转换为RDD,并在没有任何错误提示的情况下为批处理执行后续转换和操作。
但是,我怎样才能从Spark SQL编码器和结构化流媒体中逃脱关键字检查呢
有一个相关问题:
但我可以这样说,因为liftweb json仍然需要case类construtor参数“package”进行解析
我还发现还有其他json工具,比如Gson,提供json字段命名支持,将标准Java字段名转换为json字段名,在liftweb json上有类似的方法吗?