我正在尝试从 SqlServer 中读取一个表,其中有一列:travel_CDE,数据类型:binary(8)
。
这是源数据的样子:
select * from sourcetable=>
location type_code family travel_CDE
Asia Landlocked Terrain 0xD9F21933D5346766
以下是我的阅读声明:
val dataframe = spark.read.format("jdbc")
.option("url", s"jdbc:sqlserver://url:port;DatabaseName=databasename")
.option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver")
.option("user", "username")
.option("password", "password")
.option("dbtable", tablename)
.option("partitionColumn", partitionColumn)
.option("numPartitions", numPartitions)
.option("lowerBound", 1)
.option("upperBound", upperBound)
.option("fetchsize", 100)
.load()
当我打印数据框的架构时,我看到正在以二进制数据类型读取该列:
scala> dataframe.printSchema()
root
|-- location: string (nullable = true)
|-- type_code: string (nullable = true)
|-- family: string (nullable = true)
|-- travel_CDE: binary (nullable = true)
但是当我读取 spark 数据框内的数据时,我看到数据以不同的格式表示为 travel_CDE
列。
示例:
scala> dataframe.select("travel_CDE").take(1)
res11: Array[org.apache.spark.sql.Row] = Array([[B@a4a0ce])
所以我想用自己的格式火花读取数据,我把那列取出来,重新应用二进制数据类型的模式,如下所示。
import org.apache.spark.sql.types.{StructType, StructField, BinaryType}
val schema = StructType(Array(StructField("bintype", BinaryType, true)))
val bincolDF = dataframe.select("travel_CDE")
val bindColtypeDF = spark.createDataFrame(bincolDF.rdd, schema)
但即使在该列上应用 BinaryType 后,我仍然看到与之前相同的数据格式。
scala> bindtype.take(1)
res9: Array[org.apache.spark.sql.Row] = Array([[B@1d48ff1])
我正在将此数据框保存到大查询中,并且在那里也看到了相同的格式(错误的数据格式)。 以下是我的做法。
dataframe.write.format("bigquery").option("table", s"Bigquery_table_name").mode("overwrite").save()
谁能让我知道我应该怎么做才能以 Spark 以相同格式读取源数据的方式正确读取源数据。 甚至可以在读取数据时执行此操作,还是应该在将数据读取到数据帧后将列转换? 非常感谢任何帮助。