scala - 如何在 Spark Scala 中检查 df 列
问题描述
df 有一个字符串列,如“100256437”。我想再添加一列来检查它是否通过 Luhn。如果通过,点亮(真),否则点亮(假)
def Mod10(c: Column): Column = {
var (odd, sum) = (true, 0)
for (int <- c.reverse.map { _.toString.toShort }) {
println(int)
if (odd) sum += int
else sum += (int * 2 % 10) + (int / 5)
odd = !odd
}
lit(sum % 10 === 0)
}
错误:
error: value reverse is not a member of org.apache.spark.sql.Column
for (int <- c.reverse.map { _.toString.toShort }) {
^
error: value === is not a member of Int
lit(sum % 10 === 0)
^
解决方案
看起来,您正在处理 Spark Dataframes。
假设你有这个数据框
val df = List("100256437", "79927398713").toDF()
df.show()
+-----------+
| value|
+-----------+
| 100256437|
|79927398713|
+-----------+
现在,您可以将此 Luhn 测试实现为 UDF,
val isValidLuhn = udf { (s: String) =>
val array = s.toCharArray.map(_.toString.toInt)
val len = array.length
var i = 1
while (i < len) {
if (i % 2 == 0) {
var updated = array(len - i) * 2
while (updated > 9) {
updated = updated.toString.toCharArray.map(_.toString.toInt).sum
}
array(len - i) = updated
}
i = i + 1
}
val sum = array.sum
println(array.toList)
(sum % 10) == 0
}
可以用作,
val dfWithLuhnCheck = df.withColumn("isValidLuhn", isValidLuhn(col("value")))
dfWithLuhnCheck.show()
+-----------+-----------+
| value|isValidLuhn|
+-----------+-----------+
| 100256437| true|
|79927398713| true|
+-----------+-----------+
推荐阅读
- javascript - 为每个用户制作独特的个人资料?
- vb.net - 为什么我的数据库命令总是调用 sp_describe_first_result_set?
- synchronization - 对 VK_SUBPASS_EXTERNAL 和 VkSemaphore 感到困惑
- swift - 带有 async/await 的 Swift Playground “在范围内找不到‘async’”
- node.js - 在 Apple Silicon M1 上构建纱线失败
- automation - 如何使用 pyvmomi python 脚本在 VMWare 中创建端口组
- firemonkey - 如何为 FMX 控件添加缺失的边框?
- kubernetes - 在kubernetes中,如何为不同的时间段设置不同的pod数量,比如白天和黑夜
- asp.net-mvc - asp.net mvc5 create controller 不知道应该用什么代码来编辑我的信息页面
- python - 使用 socketserver 处理 http 协议