如何获取 spark 中任何值的映射值?
How to get mapped value for any value in spark?
我正在使用嵌套的 json 创建 etl。我主要使用 explode 和 withColumn 来展平嵌套的 json。 json 中的键之一具有状态名称的值。所以我想获取该值并将其转换为缩写的州名。例如:Texas 应该是 TX.
.withColumn("NewColName", $"col.someKey.keyStoringValue")
这有助于我从 json 中的所需键获取关联值。因此,如果 ...someKey.keyStoringValue 的值为 Texas,我将从我的代码中获取 Texas。但我希望它是 TX。我怎样才能做到这一点?
我试图创建一个类似的函数;
def getStateName(state: String): String = {
val maps = Map("Texas"->"TX", "Virginia"->"VA")
maps.apply(state)
}
.....
.....
.withColumn("NewColName", getStateName($"col.someKey.keyStoringValue"))
.....
.....
我收到这个错误;
error: type mismatch;
found: org.apache.spark.sql.ColumnName
required: String
当您使用 DataFrame/Spark SQL api 时,您不能应用普通的 Scala 函数。要使用这种映射函数,您需要创建一个 UDF:
import org.apache.spark.sql.functions.udf
val maps = Map("Texas"->"TX", "Virginia"->"VA")
val fun = udf { in: String => maps(in)}
...
.withColumn("NewColName", fun($"col.someKey.keyStoringValue"))
您正在寻找的方法是 when
(参见 documentation),它允许您 return 基于条件的值。你会做类似的事情:
df.withColumn(
"NewColName",
when($"col.someKey.keyStoringValue" === "Texas", "TX")
.when($"col.someKey.keyStoringValue" === "Virginia", "VA")
.otherwise("Unknown")
)
我正在使用嵌套的 json 创建 etl。我主要使用 explode 和 withColumn 来展平嵌套的 json。 json 中的键之一具有状态名称的值。所以我想获取该值并将其转换为缩写的州名。例如:Texas 应该是 TX.
.withColumn("NewColName", $"col.someKey.keyStoringValue")
这有助于我从 json 中的所需键获取关联值。因此,如果 ...someKey.keyStoringValue 的值为 Texas,我将从我的代码中获取 Texas。但我希望它是 TX。我怎样才能做到这一点? 我试图创建一个类似的函数;
def getStateName(state: String): String = {
val maps = Map("Texas"->"TX", "Virginia"->"VA")
maps.apply(state)
}
.....
.....
.withColumn("NewColName", getStateName($"col.someKey.keyStoringValue"))
.....
.....
我收到这个错误;
error: type mismatch;
found: org.apache.spark.sql.ColumnName
required: String
当您使用 DataFrame/Spark SQL api 时,您不能应用普通的 Scala 函数。要使用这种映射函数,您需要创建一个 UDF:
import org.apache.spark.sql.functions.udf
val maps = Map("Texas"->"TX", "Virginia"->"VA")
val fun = udf { in: String => maps(in)}
...
.withColumn("NewColName", fun($"col.someKey.keyStoringValue"))
您正在寻找的方法是 when
(参见 documentation),它允许您 return 基于条件的值。你会做类似的事情:
df.withColumn(
"NewColName",
when($"col.someKey.keyStoringValue" === "Texas", "TX")
.when($"col.someKey.keyStoringValue" === "Virginia", "VA")
.otherwise("Unknown")
)