如何使用 Spark 将镶木地板文件加载到 Hive 表中?

Posted

技术标签:

【中文标题】如何使用 Spark 将镶木地板文件加载到 Hive 表中?【英文标题】:How to load a parquet file into a Hive Table using Spark? 【发布时间】:2019-07-22 20:54:38 【问题描述】:

所以,我正在尝试加载一个 csv 文件,然后将其保存为 parquet 文件,然后将其加载到 Hive 表中。但是,无论何时将其加载到表中,这些值都不合适并且到处都是。我正在使用 Pyspark/Hive

这是我的 csv 文件中的内容:

这是我将 csv 转换为 parquet 并将其写入我的 HDFS 位置的代码:

#This creates the sparkSession 
from pyspark.sql import SparkSession
#from pyspark.sql import SQLContext
spark = (SparkSession \
        .builder \
        .appName("S_POCC") \
        .enableHiveSupport()\
        .getOrCreate())

df = spark.read.load('/user/new_file.csv', format="csv", sep=",", inferSchema="true", header="false")
df.write.save('hdfs://my_path/table/test1.parquet')

这成功地将其转换为镶木地板和路径,但是当我在 Hive 中使用以下语句加载它时,它会给出一个奇怪的输出。

Hive 语句:

drop table sndbx_test.test99 purge ;

create external table if not exists test99 ( c0 string, c1 string, c2 string, c3 string, c4 string, c5 string, c6 string);

load data inpath 'hdfs://my_path/table/test1.parquet;

输出:

有什么想法/建议吗?

【问题讨论】:

【参考方案1】:

而不是保存为镶木地板,然后尝试插入到 hive df.write.save('hdfs://my_path/table/test1.parquet')

你可以像下面这样直接...

df.write
.format("parquet")
.partitionBy('yourpartitioncolumns')
.saveAsTable('yourtable')

df.write
.format("parquet")
.partitionBy('yourpartitioncolumns')
.insertInto('yourtable')

注意:如果您没有分区列并且是非分区表,则不需要partitionBy

【讨论】:

【参考方案2】:

您可以在一个语句中完成这两件事,而不是创建一个表然后将数据加载到其中。

CREATE EXTERNAL TABLE IF NOT EXISTS test99 ( c0 string, c1 string, c2 string, c3 string, c4 string, c5 string, c6 string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
STORED AS PARQUET
LOCATION 'hdfs://my_path/table/' ;

【讨论】:

【参考方案3】:

如果您描述您的表,它很可能表明您的表以 ORC 格式存储数据,因为它是 Hive 的默认格式。 因此,在创建表格时,请确保提及存储基础数据的格式,在本例中为 parquet。

【讨论】:

以上是关于如何使用 Spark 将镶木地板文件加载到 Hive 表中?的主要内容,如果未能解决你的问题,请参考以下文章

将镶木地板文件加载到红移时如何格式化时间戳字段?

如何将镶木地板文件从 s3 导入到 postgresql rds

如何将镶木地板格式的特定列加载到 Redshift 光谱中?

Python:将熊猫数据框保存到镶木地板文件

将镶木地板文件读入数据框时如何为文件夹结构指定架构[重复]

如何将镶木地板文件的 int64 数据类型列转换为 SparkSQL 数据框中的时间戳?