spark read不';不能在Scala UDF函数中工作

spark read不';不能在Scala UDF函数中工作,scala,apache-spark,Scala,Apache Spark,我正试图使用spark.read获取UDF中的文件计数,但当我执行该程序时,程序挂起 我正在调用dataframe的withcolumn中的一个UDF。udf必须读取一个文件并返回其计数。但它不起作用。我将一个变量值传递给UDF函数。当我删除spark.read代码并简单地返回一个数字时,它就工作了。但是spark.read不能通过UDF工作 def prepareRowCountfromParquet(jobmaster_pa: String)(implicit spark: SparkSes

我正试图使用spark.read获取UDF中的文件计数,但当我执行该程序时,程序挂起

我正在调用dataframe的withcolumn中的一个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列应获取文件的行数

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


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

您不能在UDF内创建或使用
数据帧
,此外
spark
对象仅存在于驱动程序中,在执行器上它将为
null
。例如,看看这个:谢谢arnon。我没有调用udf,而是将spark read放在了列中。成功了。谢谢你让我知道这个概念