spark read 在 Scala UDF 函数中不起作用

Posted

技术标签:

【中文标题】spark read 在 Scala UDF 函数中不起作用【英文标题】:spark read doesn't work inside Scala UDF function 【发布时间】:2019-04-14 16:51:50 【问题描述】:

我正在尝试使用 spark.read 来获取我的 UDF 中的文件计数,但是当我执行程序时,此时会挂起。

我在数据框的列中调用 UDF。 udf 必须读取一个文件并返回它的计数。但它不起作用。我将一个变量值传递给 UDF 函数。当我删除 spark.read 代码并简单地返回它工作的数字时。但 spark.read 不能通过 UDF 工作

def prepareRowCountfromParquet(jobmaster_pa: String)(implicit spark: SparkSession): Int = 
      print("The variable value is " + jobmaster_pa)
      print("the count is " + spark.read.format("csv").option("header", "true").load(jobmaster_pa).count().toInt)
      spark.read.format("csv").option("header", "true").load(jobmaster_pa).count().toInt
    
val SRCROWCNT = udf(prepareRowCountfromParquet _)

  df
  .withColumn("SRC_COUNT", SRCROWCNT(lit(keyPrefix))) 

SRC_COUNT 列应该获取文件的行

【问题讨论】:

您不能在 UDF 中创建或使用DataFrame,此外,spark 对象仅存在于执行程序的 驱动程序 中它将是null。例如,看看这个:***.com/questions/48893002/… 【参考方案1】:

UDF 不能使用 spark 上下文,因为它只存在于驱动程序中并且不可序列化。

一般来说,您需要阅读所有 csv,使用 groupBy 计算计数,然后您可以对 df 进行左连接

【讨论】:

谢谢阿农。我没有调用 udf,而是将 spark 读入列中。有效。感谢您让我知道这个概念

以上是关于spark read 在 Scala UDF 函数中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Scala 和 Spark UDF 函数

我们如何在 Spark-Scala 和 Cataloging UDF 中注册一个函数以及其他函数?

如何使用scala将特定函数转换为apache spark中的udf函数? [复制]

scala用户定义函数在spark sql中不起作用

如果其他,Spark scala udf 错误

遇到问题--spark-scala---Cannot resolve overloaded method ‘udf‘--Defines a Scala closure of 11 arguments