首页 > 解决方案 > 我在 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

这是它在 IntelliJ IDEA 中的样子 在此处输入图像描述

更新了代码:将 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的西雅图图书馆结帐记录

谢谢,人们!

标签: scaladataframeapache-sparkapache-spark-sql

解决方案


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(":")}

推荐阅读