Возникли проблемы при вставке искрового фрейма данных в таблицу Phoenix из-за несоответствия столбцов - PullRequest
0 голосов
/ 08 января 2019

Я создаю таблицу феникса со структурой ниже

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 столбцов, которые я не понимаю.

Есть ли способ вставить эти данные.

1 Ответ

0 голосов
/ 14 января 2019

Я прочитал в одной из документов 'phoenix', что имена столбцов в целевой таблице и источнике 'dataframe' должны быть точно такими же, и они также чувствительны к регистру. Я понял, что мои столбцы таблицы были строчными, а столбцы dataframe - прописными. Я пересоздал свою таблицу и 'dataframe', чтобы иметь имена столбцов в верхнем регистре, как показано ниже:

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()
...