Spark-Hive-Sqoop:使用 Spark 在配置单元 table 中保存数据,显示带有 Sqoop 导出的垃圾字符

Spark-Hive-Sqoop: Saving data in hive table using Spark showing junk char with Sqoop export

我正在尝试从配置单元 table(hivetable1) 加载数据,然后使用 spark 对其进行一些修改并再次保存在另一个 table(hivetable2) 在配置单元中。 当我从 hivetable2 执行 select * 时,它会显示正确的数据,但是当我尝试在 hdfs 中查看相同的文件时,它会显示所有垃圾字符,如下所示。 当我尝试使用 Sqoop 在 postgres 中导出相同的数据时,它会将整个数据附加到 postgres table 的单列中。

Spark 脚本:

spark = SparkSession \
    .builder \
    .appName("Python Spark SQL Hive integration example") \
    .config("hive.metastore.uris", "thrift://localhost:9083") \
    .config("spark.sql.catalogImplementation=hive") \
    .enableHiveSupport() \
    .getOrCreate() 

df = spark.sql("select * from hivetable1")

df.write.format("hive").mode('overwrite').option("delimiter", "\t").saveAsTable("hivetable2")

HDFS文件数据:

hadoop fs -cat /user/hive/warehouse/tb.db/hivetable2/part-0000

lnullunknownnullnullnull\N\N\N\Nnullnullnullnullnull0.00.0nullnull\Nnull\Nnullnullnullnullnull\Nnullnull\Nnullnullnull\Nnullnullnull\Nnullnull

Sqoop 导出:

 sqoop export --connect jdbc:postgresql://localhost:5432/postgres?stringtype=unspecified -m 1 --table test --export-dir /user/hive/warehouse/tb.db/hivetable2 \
 --username test --password test --input-fields-terminated-by '\t'

我建议单独创建一个配置单元 table 并将数据附加到 table。 其次,一旦完成,您就可以返回数据库。

df.write.mode("overwrite").insertInto("database_name.table", overwrite=True)