我正在尝试使用spark读取Greenplum数据库上的RDBMS表。我有以下几列:
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`'
我看到我以错误的格式进行转换,但是我不明白如何一步一步地读取十进制和文本格式的同一列。 谁能让我知道是否有办法实现这一目标?
答案 0 :(得分:0)
不确定该错误,但是您尝试定义自定义架构吗?假设您已经了解架构,请使用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中对此进行测试,但是它应该可以工作。