如何将二进制列数据读入火花数据帧?

时间:2021-03-10 07:31:22

标签: sql-server scala apache-spark

我正在尝试从 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 以相同格式读取源数据的方式正确读取源数据。 甚至可以在读取数据时执行此操作,还是应该在将数据读取到数据帧后将列转换? 非常感谢任何帮助。

0 个答案:

没有答案
相关问题