我对接收文件有一个要求,该文件有多列。一列数据类型是Map结构。其他是字符串。 在此Map结构中,每个记录有多个Key:value对。
地图数据的Ex-
地图 (f-expaneded-port:451,
custNo : 415723,
channel : netsite,
y-ub-eg-en-author : "7Im5hbWUiOiJpbnRlcm5hbEFjY291bnRJZHMiLCJ2YWx1ZSI6WyIwNjIw16", /*This value is base64 */
sessionid : e5cdb71d3572dd6f7gh8jh6dssf8g688dda0,
y-expandeded-proto : https)
每个记录可能具有不同的键值对。
要求:-我们必须找到键“ y-ub-eg-en-author”,并使用Spark Sql对相应的Value应用unbase64()函数来解码该值。如果没有这样的密钥(y-ub-eg-en-author),则无济于事。
任何人都可以让我们知道可能的解决方案,如何在不影响其他键值对的情况下将unbase64函数应用于特定键值。
谢谢
答案 0 :(得分:0)
尝试了以下选项,并且正在解决。请检查一下。
1)第一张地图已经爆炸。
2)根据关键条件应用了unbase64。
3)然后,再次将爆炸列更改为MAP。在主键列上分组。
val Query="""SELECT CAST(Id AS String) AS Primary_ID,key_index as key_index,case when key_index in ('x-insider-token','x-ent-auth') then CAST(unbase64( CAST(key_value AS STRING) ) AS STRING) else key_value end as value FROM kafka_avro_events LATERAL VIEW EXPLODE(map_value) as key_index, key_value """
val df1 = spark.sql(Query)
val result = df1.withColumn("map", map($"key_index", $"value")).groupBy("Primary_ID").agg(collect_list("map")).as[(String, Seq[Map[String, String]])].map { case (id, list) => (id, list.reduce(_ ++ _)) }.toDF("id", "gMap")
result.show(truncate = false)
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|id |gMap |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|corrId1|Map(f-expaneded-port -> 451, custNo -> 415723, channel -> netsite, y-ub-eg-en-author -> {"decision":"PERMIT","authorized":true} , sessionid -> e5cdb71d3572dd6f7gh8jh6dssf8g688dda0, y-expandeded-proto -> https |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+