scala - 映射函数中的数组操作:Spark 1.6
问题描述
我有一列是结构类型的包装数组,带有一个整数和一个双精度值。
架构如下所示:
|-- pricing_data: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- _1: integer (nullable = false)
| | |-- _2: double (nullable = false)
因此,每当此列值为 [[0,0.0]] 时,我都需要将其更改为空数组。[[0,0.0]] -> [[]]。
我怎样才能使用地图做到这一点?或使用数据框?
解决方案
尝试这个-
spark>=2.4
val df = Seq(Seq((0, 0.0)), Seq((1, 2.2))).toDF("pricing_data")
df.show(false)
df.printSchema()
/**
* +------------+
* |pricing_data|
* +------------+
* |[[0, 0.0]] |
* |[[1, 2.2]] |
* +------------+
*
* root
* |-- pricing_data: array (nullable = true)
* | |-- element: struct (containsNull = true)
* | | |-- _1: integer (nullable = false)
* | | |-- _2: double (nullable = false)
*/
df.withColumn("pricing_data", expr(
"TRANSFORM(pricing_data, x -> if(x._1=0 and x._2=0.0, named_struct('_1', null, '_2', null), x))"
))
.show(false)
/**
* +------------+
* |pricing_data|
* +------------+
* |[[,]] |
* |[[1, 2.2]] |
* +------------+
*/
spark<2.4
// spark<2.4
val dataType = df.schema("pricing_data").dataType
val replace = udf((arrayOfStruct: mutable.WrappedArray[Row]) => {
arrayOfStruct.map(row => {
val map = row.getValuesMap(row.schema.map(_.name))
if(map("_1")==0 && map("_2") == 0.0) {
Row.fromTuple((null, null))
} else row
})
}, dataType)
df.withColumn("pricing_data", replace($"pricing_data"))
.show(false)
/**
* +------------+
* |pricing_data|
* +------------+
* |[[,]] |
* |[[1, 2.2]] |
* +------------+
*/
推荐阅读
- javascript - 将数组中的所有数字填充到随机 div 中
- flutter - Flutter Futures:等待侦听器至少完成一次
- python - 显示登录用户的数据列表
- swiftui - SwiftUI 状态变量非对称转换
- c++ - 无法理解 C++ 参考手册中的示例中使用的这种类型 `void(C::* volatile)(int) const`
- python - PyCharm 无法加载 pandas 模块
- javascript - Vue Router 链接使用 Vue Bootstrap 表中的另一个列数据路径
- java - JAVA单独的类方法不增加我的主类方法中的变量
- sql - Oracle UNION 取决于 IF 条件
- pdf - 如何将矩形区域从多页 PDF 的一页转换为 PNG?裁剪/裁剪问题