【问题标题】:Spark : get specific value of the column map if the key existsSpark:如果键存在,则获取列映射的特定值
【发布时间】:2021-05-01 09:22:17
【问题描述】:

我的数据集中有一列“price_map”,它是一个像这样的 HashMap:

(usd_price,100),
(eur_price,200),
(jpy_price,500)...

现在我想检索 usd_price 的价格值(即 100),当键 usd_price 存在于地图中时,并将其作为新行放入我的数据集中。

我尝试过这样的事情:

    dataset = dataset.withColumn("usd_price", when(
            size(map_keys(dataset.col(price_map))),
            map_values(dataset.col(price_map))
                    .getField("usd_price"))
            .otherwise(lit("no data"))
    );

但它告诉我

org.apache.spark.sql.AnalysisException: cannot resolve 'map_values(`price_map`)['usd_price']' due to data type mismatch: argument 2 requires integral type, however, ''usd_price'' is of string type.;;

我想知道这样做的正确方法是什么?

【问题讨论】:

  • 我不确定我是否理解为什么发布的答案没有给你你想要的。从评论中,您所说的“但我还需要确保此地图列price_map 存在”是什么意思?也许你可以澄清一下。

标签: java scala apache-spark dataset


【解决方案1】:

你可以直接使用getItem获取map值,如果找不到key,可以使用coalesce替换null

dataset2 = dataset.withColumn(
    "usd_price",
    coalesce(
        dataset.col("price_map").getItem("usd_price"),
        lit("no data")
    )
);

【讨论】:

  • 谢谢,但我还需要确定这个地图列“price_map”是否存在
猜你喜欢
  • 2018-11-15
  • 2022-12-05
  • 2021-03-05
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多