Как привести десятичное значение в строку в искре при чтении данных из Greenplum? - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь прочитать таблицу RDBMS в базе данных Greenplum с помощью spark.У меня есть следующие столбцы:

val allColumnsSeq: Seq[String] = Seq("usd_exchange_rate", "usd_exchange_rate::character varying as usd_exchange_rate_text")

Я пытаюсь прочитать вышеуказанные столбцы в spark как:

val yearDF = spark.read.format("io.pivotal.greenplum.spark.GreenplumRelationProvider").option("url", connectionUrl)
.option("dbtable", "x_lines")
.option("dbschema","copydb")
.option("user", devUserName).option("password", devPassword)
.option("partitionColumn","id")
.load()
.where("year=2017 and month=12")
.select(allColumnsSeq map col:_*)
.withColumn(flagCol, lit(0))

В gp есть определенные столбцы, имеющие тип данных: десятичные, которые содержат точностьцифры.В приведенной выше таблице это:

usd_exchange_rate

Он содержит почти 45 цифр точности.В нашем проекте мы сохраняем исходный столбец (usd_exchange_rate) и создаем новый столбец из usd_exchange_rate в символьном типе данных и к имени его столбца, к которому добавляется _text.В этом случае

decimal datatype: usd_exchange_rate и тот же столбец в char datatype: usd_exchange_rate_text

Когда я выполняю вышеприведенную строку, я получаю исключение:

org.apache.spark.sql.AnalysisException: cannot resolve '`usd_exchange_rate::character varying as usd_exchange_rate_text`'

Я вижу, чточто я произвожу это в неправильном формате, но я не понимаю, как я могу прочитать один и тот же столбец в десятичном и текстовом формате за один шаг.Может ли кто-нибудь дать мне знать, если есть способ достичь этого в искре?

1 Ответ

0 голосов
/ 24 декабря 2018

Не уверен насчет ошибки, но для приведения пытались ли вы определить собственную схему?Предполагая, что вы уже знаете свою схему, определите свою собственную пользовательскую схему с помощью StructType.

import org.apache.spark.sql.types._

val customSchema = StructType(Seq(
StructField("usd_exchange_rate",StringType,true),
StructField("aud_exchange_rate",StringType,true),
.
.
.
StructField("<some field>",<data type>,<Boolean for nullable>)
))

val yearDF = spark.read.format("io.pivotal.greenplum.spark.GreenplumRelationProvider").option("url", connectionUrl)
    .option("dbtable", "x_lines")
    .option("dbschema","copydb")
    .option("user", devUserName).option("password", devPassword)
    .option("partitionColumn","id")
    .schema(customSchema)
    .load()
    .where("year=2017 and month=12")
    .select(allColumnsSeq map col:_*)
    .withColumn(flagCol, lit(0))

Я не тестировал ее в IDE, но она должна работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...