【发布时间】:2019-03-10 06:15:16
【问题描述】:
我目前正在使用 Apache Spark 进行流式传输项目。我有 2 个数据源,第一个从 Kafka 获取新闻数据。这些数据每次都在更新。第二个,我得到 masterWord 字典。该变量包含单词的数据框和单词的唯一键。
我想处理新闻数据,然后通过将数据与 masterWord 字典匹配,将其从单词 Seq 转换为 words_id 的 Seq。但是,我在访问我的 UDF 中的 masterWord 数据框时遇到了问题。当我尝试访问 UDF 中的数据帧时,Spark 返回此错误
原因:org.apache.spark.SparkException:作业因阶段失败而中止:阶段 4.0 中的任务 0 失败 1 次,最近一次失败:丢失任务 0.0 i n stage 4.0 (TID 4, localhost, executor driver): java.lang.NullPointerException
为什么不能在 UDF 中访问数据帧?
从另一个数据框获取价值的最佳做法是什么?
这是我的代码
// read data stream from Kafka
val kafka = spark.readStream
.format("kafka")
.option("kafka.bootstrap.servers", PropertiesLoader.kafkaBrokerUrl)
.option("subscribe", PropertiesLoader.kafkaTopic)
.option("startingOffsets", "earliest")
.option("maxOffsetsPerTrigger", "100")
.load()
// Transform data stream to Dataframe
val kafkaDF = kafka.selectExpr("CAST(value AS STRING)").as[(String)]
.select(from_json($"value", ColsArtifact.rawSchema).as("data"))
.select("data.*")
.withColumn("raw_text", concat(col("title"), lit(" "), col("text"))) // add column aggregate title and text
// read master word dictionary
val readConfig = ReadConfig(Map("uri" -> "mongodb://10.252.37.112/prayuga", "database" -> "prayuga", "collection" -> "master_word_2"))
var masterWord = MongoSpark.load(spark, readConfig)
// call UDF
val aggregateDF = kafkaDF.withColumn("text_aggregate", aggregateMongo(col("text_selected")))
// UDF
val aggregateMongo = udf((content: Seq[String]) => {
masterWord.show()
...
// code for query masterWord whether var content exist or not in masterWord dictionary
})
【问题讨论】:
-
广播数据帧,但广播值大小,默认不能超过10MB。首先确保执行器端的数据框不为空,然后检查大小。
-
@deo 我在本地运行这个程序,我假设如果我显示我的代码之类的数据框,我会在执行程序中运行它吗?我加载后显示了它,没有null。但是当我在 UDF 中访问时,有 null。
-
@user10465355 对不起,我不是在创建数据框,而是从数据源加载数据,有什么参考资料可以让我的数据框可以加载到 UDF 中吗?
标签: scala apache-spark dataframe spark-structured-streaming