【问题标题】:Getting Null pointer exception while accessing BroadCasted Dataframe访问广播数据帧时出现空指针异常
【发布时间】:2016-07-07 21:51:19
【问题描述】:

在广播数据帧并尝试在 Spark UDF 中访问它们时,我收到空指针异常。

UDF 定义-

def test_udf(parm1: String,  parm2: String,  paarm3: String,  ) = {
println ("Inside UDF ")           
B.value.take(1).foreach { println }
println("after print") 

..... ....... }

> sqlContext.udf.register("test_udf", test_udf _)

广播-

val B = sc.broadcast(sqlContext.sql("""Select * FROM table_a where col1='10102'""")) // Returns almost 20 MB data

访问 UDF-

val df = sqlContext.sql("SELECT test_udf(parm1,parm2,parm3) AS test FROM table_b").take(1)

在这一行之后,我在 B.value.take(1).foreach { println }

行的 UDF 中得到空指针异常

我怀疑广播没有正确进行。这段代码有问题吗?使用 Spark 1.6.1

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案1】:

    你得到一个异常,因为它不是一个有效的 Spark 程序:

    • 广播DataFrame 对象不是有意义的操作。这就是我们have broadcast join hints的原因。
    • Spark 不支持分布式数据结构的嵌套操作。换句话说,您无法在 UDF 中访问 DataFrame

    【讨论】:

    • 感谢您的评论。无法连接,因为键不在 table_b 中用于连接。我需要通过 table_a 进行查找以获取正确的值。有没有办法做到这一点?
    • 除非它是本地结构(例如收集的行),否则不加入数据是不可能的。
    • 谢谢。你的两点都非常正确。艰难地学会了它。
    • 谢谢。 Post 帮助我真正修复了遗留代码。
    猜你喜欢
    • 2015-03-22
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多