scala - 我在 spark 数据框中的用户定义函数接受什么输入?
问题描述
我尝试将“格式组”和“格式子组”这两列合并到一个名为“格式”的列中。
最后 Format 列中的 O/P 应该是 Format Group:Format Subgroup 的形式
我需要使用一些给定的数据创建自己的 UDF,但我不确定为什么我的 UDF 不喜欢我给它的输入。
这是我使用的数据的第一行:
结帐DF:
BibNumber, ItemBarcode, ItemType, Collection, CallNumber, CheckoutDateTime
1842225, 0010035249209, acbk, namys, MYSTERY ELKINS1999, 05/23/2005 03:20:00 PM
数据字典DF:
Code, Description, Code Type, Format Group, Format Subgroup
acdvd, DVD: Adult/YA, ItemType, Media, Video Disc
更新了代码:将 seq[seq[string]] 更改为 String
def numberCheckoutRecordsPerFormat(checkoutDF: DataFrame, dataDictionaryDF: DataFrame): DataFrame = {
val createFeatureVector = udf{(Format_Group:String, Format_Subgroup:String) => {
dataDictionaryDF.map(x => if(Format_Group.flatten.contains(x)) 1.0 else 0.0)++Array(Format_Subgroup)
}
}
checkoutDF
.na.drop()
.join(dataDictionaryDF
.select($"Format_Group", $"Format_Subgroup", $"Code".as("ItemType"))
, "ItemType")
.withColumn("Format", createFeatureVector(dataDictionaryDF("Format_Group"), dataDictionaryDF("Format_Subgroup")))
.groupBy("ItemBarCode")
.agg(count("ItemBarCode"))
.withColumnRenamed("count(ItemBarCode)", "CheckoutCount")
.select($"Format", $"CheckoutCount")
}
此外,numberCheckoutRecordsPerFormat 应该返回一个 DataFrame 的格式和给定项目的 Checkouts 数量 - 但我自己已经涵盖了这部分。
使用的数据集是来自 Kaggle的西雅图图书馆结帐记录
谢谢,人们!
解决方案
Doomdaam,你可以尝试使用concat_ws
内置函数(尽可能使用内置函数)。您的代码将如下所示:
checkoutDF
.na.drop()
.join(dataDictionaryDF
.select($"Format_Group", $"Format_Subgroup", $"Code".as("ItemType"))
, "ItemType")
.withColumn("Format", concat_ws(":",$"Format_Group", $"Format_Subgroup"))
.groupBy("ItemBarCode")
.agg(count("ItemBarCode"))
.withColumnRenamed("count(ItemBarCode)", "CheckoutCount")
.select($"Format", $"CheckoutCount")
否则,您的 UDF 将是:
val createFeatureVector = udf{(formatGroup:String, formatSubgroup:String) => Seq(formatGroup,formatSubgroup).mkString(":")}
推荐阅读
- node.js - express session 默认会持续多久
- antd - 将 ant design select 组件的标题更改为与值不同的名称
- r - geom_col() hot 以相同的全比例显示列?
- react-native - 滚动到 FlatList 的页脚组件
- c# - C# Selenium Chrome 从许多证书中选择一个
- ruby - 有什么方法可以测试多个网站并使用 ruby、capybara 和 cucumber 检查它们的 http 状态代码
- javascript - OpenLayers 渲染时间
- ios - AVAudioPlayer 没有快速播放音频
- python-3.x - terraform S3 模块,无法调用 KMS 密钥 arn 调用模块
- bash - 将csv第1列中的前x个字符组合到第2列中的所有字符