我正在创建一个具有以下结构的凤凰表
CREATE TABLE IF NOT EXISTS "TEST1"(
"slhdr" VARCHAR(100),
"totmins" INTEGER,
"totslrcds" INTEGER,
"tottime" INTEGER, CONSTRAINT pk PRIMARY KEY ("sleepelement")
);
现在,我已经通过从另一个数据帧中选择特定列从 JSON 数据创建了一个数据帧。下面是此数据帧的架构:
newDF.printSchema
root
|-- slhdr: array (nullable = true)
| |-- element: string (containsNull = true)
|-- totmins: long (nullable = true)
|-- totslrcds: long (nullable = true)
|-- tottime: long (nullable = true)
现在,我正在尝试借助以下代码使用此数据帧将数据插入到上面的凤凰表中:
newDF.write
.format("org.apache.phoenix.spark")
.mode("overwrite")
.option("table", "TEST1")
.option("zkUrl", "Server details")
.save()
但是它无法将数据帧列与表列映射,并且我收到以下错误:
Caused by: org.apache.spark.SparkException: Job aborted due to stage failure: Task 33 in stage 74.0 failed 4 times, most recent failure: Lost task 33.3 in stage 74.0 (TID 2663, ailab003.incedoinc.com, executor 2): java.sql.SQLException: Unable to resolve these column names:
SLHDR,TOTMINS,TOTSLRCDS,TOTTIME
Available columns with column families:
slhdr,0.totmins,0.totslrcds,0.tottime
看起来凤凰表正在为我不明白的最后 0 列创建默认列系列"3"。
有没有办法插入这些数据。
我在其中一个"phoenix"文档中读到,目标表和源"数据帧"中的列名应该完全相同,并且它们也区分大小写。我意识到我的表列是小写的,"数据帧"列是大写的。我重新创建了我的表和"数据帧",两者都具有大写列名称,如下所示:
CREATE TABLE IF NOT EXISTS "TEST1"(
"SLHDR" VARCHAR(100),
"TOTMINS" INTEGER,
"TOTSLRCDS" INTEGER,
"TOTTIME" INTEGER, CONSTRAINT pk PRIMARY KEY ("sleepelement")
);
newDF.printSchema
root
|-- SLHDR: array (nullable = true)
| |-- element: string (containsNull = true)
|-- TOTMINS: long (nullable = true)
|-- TOTSLRCDS: long (nullable = true)
|-- TOTTIME: long (nullable = true)
一旦我这样做,使用同一段代码成功地将数据插入到我的凤凰表中:
newDF.write
.format("org.apache.phoenix.spark")
.mode("overwrite")
.option("table", "TEST1")
.option("zkUrl", "Server details")
.save()