我正在尝试一个简单的示例,将数据发布到Kafka并使用Spark进行使用。
这是生产者代码:
var kafka_input = spark.sql("""
SELECT CAST(Id AS STRING) as key,
to_json(
named_struct(
'Id', Id,
'Title',Title
)
) as value
FROM offer_data""")
kafka_input.write
.format("kafka")
.option("kafka.bootstrap.servers", kafkaBrokers)
.option("topic", topicName)
.save()
我验证了kafka_input
的值是json字符串,而数字则是密钥的字符串。
这是消费者代码:
val df = spark
.read
.format("kafka")
.option("kafka.bootstrap.servers", kafkaBrokers)
.option("subscribe", topicName)
.load()
df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
.as[(String, String)]
df.take(50)
display(df)
我在用户端收到的数据是base64编码的字符串。
如何在Scala中解码值? 同样,此read语句不会从Kafka队列中刷新这些记录。我认为这是因为我没有将任何确认信号发送回Kafka。那是对的吗?如果是这样,我该怎么办?
答案 0 :(得分:0)
尝试一下。
df.foreach(row => {
val key = row.getAs[Array[Byte]]("key")
val value = row.getAs[Array[Byte]]("value")
println(scala.io.Source.fromBytes(key,"UTF-8").mkString)
println(scala.io.Source.fromBytes(value,"UTF-8").mkString)
})
答案 1 :(得分:0)
问题出在我对SelectExpr的使用上。它并没有做就地转换,它返回转换后的数据。 修复:
df1 = df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
.as[(String, String)]
display(df1)