如何使用Spark将parquet文件加载到Hive表中?

3
所以,我正在尝试加载一个csv文件,然后将其保存为parquet文件,最后加载到Hive表中。但是,当我将其加载到表中时,值的位置不正确,且混乱无序。我正在使用Pyspark/Hive。
这是我的csv文件内容: enter image description here 以下是我的代码,用于将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')

这段代码成功将数据转换为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;

输出: 在此输入图片描述

有什么想法/建议吗?

3个回答

6

不需要先保存为parquet再尝试插入到hive中,可以直接使用以下代码:

df.write.insertInto('test1')

该代码可以让您将DataFrame数据直接插入到已经创建的Hive表中。

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

或者

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

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


0

不必先创建表再将数据加载到其中,你可以在一条语句中同时完成这两个操作。

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/' ;

-1
如果您描述您的表格,很可能会显示您的表格以ORC格式存储数据,因为这是Hive的默认格式。因此,在创建表格时,请确保提及底层数据将以哪种格式存储,例如parquet。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接