Spark:Kafka用户将数据作为base64编码的字符串获取,即使Producer并未明确编码

时间:2019-01-11 01:56:11

标签: scala apache-spark apache-kafka

我正在尝试一个简单的示例,将数据发布到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编码的字符串。

enter image description here

如何在Scala中解码值? 同样,此read语句不会从Kafka队列中刷新这些记录。我认为这是因为我没有将任何确认信号发送回Kafka。那是对的吗?如果是这样,我该怎么办?

2 个答案:

答案 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)