我是Spark的初学者,我曾尝试在SparkSQL中将数据插入配置单元表中,但出现错误java.lang.ArrayIndexOutOfBoundsException:0位于org.apache.spark.sql.cocatalyst.expressions.GenericRow.isNullAt(rows.scala:79)
请在下面找到我的代码:
public class HiveWriter {
public static class IPCCount implements Serializable {
public IPCCount(int permid, int year, String ipc, int count) {
this.permid = permid;
this.year = year;
this.ipc = ipc;
this.count = count;
}
public int permid;
public int year;
public int count = 0;
public String ipc;
}
public static void main(String[] args) {
SparkConf sparkConf = new SparkConf().setAppName("HiveWriter");
JavaSparkContext sc = new JavaSparkContext(sparkConf);
HiveContext sqlContext = new org.apache.spark.sql.hive.HiveContext(sc.sc());
JavaRDD<IPCCount> lines = sc.parallelize(Arrays.asList(new IPCCount(000000000, 2010, "000000000", 10)));
DataFrame df = sqlContext.createDataFrame(lines, IPCCount.class);
df.registerTempTable("ipc_codes_new");
sqlContext.sql("INSERT INTO TABLE xademo.ipc_codes SELECT * FROM ipc_codes_new");
sc.close();
}}
从配置单元表中读取数据效果良好,但我无法插入数据。我还测试了临时表中的数据是否存在。
我使用Spark 1.3。
提前感谢!
如果我没有记错,registerTempTable不会使表ipc_codes_new
可用于配置单元,换句话说,临时表对实际配置单元表不可见。
该临时表可以由Spark上的HiveContext(作为临时源)使用,但不能由Hive本身使用。您发送的INSERT查询直接进入配置单元本身。