【问题标题】:SaveAsTable in Spark Scala: HDP3.xSpark Scala 中的 SaveAsTable:HDP3.x
【发布时间】:2020-09-01 07:42:58
【问题描述】:

我在 Spark 中有一个数据框,我将其作为表格保存在我的配置单元中。但出现以下错误消息。

    java.lang.RuntimeException:
    com.hortonworks.spark.sql.hive.llap.HiveWarehouseConnector
    does not allow create table as select.at scala.sys.package$.error(package.scala:27)

谁能帮我把它保存为蜂巢中的表格。

    val df3 = df1.join(df2, df1("inv_num") === df2("inv_num")  // Join both dataframes on id column
    ).withColumn("finalSalary", when(df1("salary") < df2("salary"), df2("salary") - df1("salary")) 
    .otherwise(
    when(df1("salary") > df2("salary"), df1("salary") + df2("salary"))  // 5000+3000=8000  check
    .otherwise(df2("salary"))))    // insert from second dataframe
    .drop(df1("salary"))
    .drop(df2("salary"))
    .withColumnRenamed("finalSalary","salary")

    }
    }

    //below code is not working when I'm executing below command its throwing error as 

    java.lang.RuntimeException:
    com.hortonworks.spark.sql.hive.llap.HiveWarehouseConnector
    does not allow create table as select.at scala.sys.package$.error(package.scala:27)

     df3.write.
     format("com.hortonworks.spark.sql.hive.llap.HiveWarehouseConnector")
    .option("database",  "dbname")
    .option("table", "tablename")
    .mode("Append")
    .saveAsTable("tablename")

注意:表已在数据库中可用,我正在使用 HDP 3.x。

【问题讨论】:

    标签: scala apache-spark hive apache-spark-sql hdp


    【解决方案1】:

    根据spark documentationsaveAsTable 函数的行为随使用的模式而变化,默认为ErrofIfExist。 在您使用 Hive 的情况下,请尝试使用 insertInto,但请记住,数据框列的顺序必须与命运相同。

    【讨论】:

    • 试过但没用。它在 cloudera 中运行良好,但在 HDP 中无法运行。
    【解决方案2】:

    试试registerTempTable 然后 -> spark.sql() -> 然后写

    df3.registerTempTable("tablename");
    spark.sql("SELECT salary FROM tablename")
    .write.format(HIVE_WAREHOUSE_CONNECTOR)
    .option("database",  "dbname")
        .option("table", "tablename")
        .mode("Append")
    .option("table", "newTable")
    .save()
    
    

    【讨论】:

    • 试过 .save 它没有给出任何错误,但我没有在我的表中获取数据,我已经在 hdfs 位置和提到的数据库 /tablename 中检查过。@QuickSilver
    • salary 8000 3000 我也对 'inv_num' 列使用了 drop 方法,所以现在我在输出中只得到薪水。@QuickSilver
    【解决方案3】:

    看看下面的解决方案是否适合你,

    val df3 = df1.join(df2, df1("inv_num") === df2("inv_num")  // Join both dataframes on id column
        ).withColumn("finalSalary", when(df1("salary") < df2("salary"), df2("salary") - df1("salary")) 
        .otherwise(
        when(df1("salary") > df2("salary"), df1("salary") + df2("salary"))  // 5000+3000=8000  check
        .otherwise(df2("salary"))))    // insert from second dataframe
        .drop(df1("salary"))
        .drop(df2("salary"))
        .withColumnRenamed("finalSalary","salary")
    
    val hive = com.hortonworks.spark.sql.hive.llap.HiveWarehouseBuilder.session(spark).build()
    
    df3.createOrReplaceTempView("<temp-tbl-name>")
    hive.setDatabase("<db-name>")
    hive.createTable("<tbl-name>")
    .ifNotExists()
    
    sql("SELECT salary FROM <temp-tbl-name>")
    .write
    .format(HIVE_WAREHOUSE_CONNECTOR)
    .mode("append")
    .option("table", "<tbl-name>")
    .save()     
    

    【讨论】:

    • @QuickSilver 试过但没有在表中获取任何数据。我想当我在做 df3.registerTempTable("tablename");它在 spark 元数据中的创建表,如果我在 hive 仓库中写入数据,则从那里获取数据。
    • 没用。现在我已经将数据保存在 hdfs 位置,然后从那里加载到表中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 2017-08-10
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多