如何将 txt 文件转换为 parquet 文件并将其加载到 hdfs table-pyspark

Posted

技术标签:

【中文标题】如何将 txt 文件转换为 parquet 文件并将其加载到 hdfs table-pyspark【英文标题】:How to transform a txt file into a parquet file and load it into a hdfs table-pyspark 【发布时间】:2019-08-05 21:46:25 【问题描述】:

我有一个文本文件,我试图将其转换为 parquet 文件,然后通过将其写入 hdfs 路径将其加载到配置单元表中。一切都运行了,但表格没有显示任何值。

这是我的代码:

#Create my table
spark.sql("create  external table if not exists table1 ( c0 string, c1 string, c2 string)  STORED AS parquet LOCATION 'hdfs://hadoop_data/hive/table1'")

hdfs="hdfs://hadoop_data/hive/table1/output.parquet"

#Read my data file
e=spark.read.text("/home/path/sample_txt_files/sample5.txt")

#Write it to hdfs table as a parquet file
e.write.parquet("hdfs")

一切都运行了,但是当我通过 select * from table1 检查表的内容时,没有任何值:

sample5.txt 文件中的内容如下:

ID,Name,Age
1,James,15

.parqeut 文件中的内容

关于为什么表格中没有显示数据的任何想法或建议?

【问题讨论】:

您是否尝试运行不带引号的最后一个命令?看来您实际上是在传递“hdfs”而不是字符串 sdfs(完整路径)。 好吧,它正在读取 parquet 目录,而不是 parquet 文件夹中的成功文件。你知道如何通过它并阅读所有成功的 parquet 文件吗? 我也试过不带引号。 你能试试这个e.write.parquet("hdfs://hadoop_data/hive/table1/output.parquet")吗? 【参考方案1】:

您是否在编写hdfs://hadoop_data/hive/table1/output.parquet 目录时尝试在hive shell 中设置这些参数,但table 是在hdfs://hadoop_data/hive/table1/ 上创建的。当您在编写 output.parquet 嵌套目录时。

SET hive.mapred.supports.subdirectories=TRUE;
SET mapred.input.dir.recursive=TRUE;

然后检查你是否能够看到来自hive 表的数据。

(or)

尝试使用.insertInto函数将数据插入table directly

e.write.format("parquet").insertInto("default.table1")

更新:

当您阅读文本文件时,即使您有 3 列,火花也会读取为一列(值)。

e=spark.read.text("/home/path/sample_txt_files/sample5.txt") //returns dataframe

f=e.withColumn("c0",split(col("value"),",")(0)).withColumn("c1",split(col("value"),",")(1)).withColumn("c2",split(col("value"),",")(2)).drop("value") //split the column and extract data

f.write.format("parquet").insertInto("default.table1")

如果您有 csv file (or) any other delimiter file,请使用 spark.read.csv() 和选项来读取文件。

【讨论】:

你有没有遇到过下面这个问题。我后来无法重现它。 donnow 出于什么原因它来了并整理出来。 ***.com/questions/53372962/… 当我尝试将数据直接插入表中时,它给出了目标表有 3 列但插入的数据有 1 列的错误,但在将其格式化为镶木地板之前它有 3 列。您是否认为一旦转换为镶木地板,它会改变列数? @JamesDavinport,请查看更新后的答案。 @vikrantrana,对不起.. 我无法使用spark 2.4 版本重新创建场景。一切都按预期工作..! ***.com/questions/53372962/… @dhnsh,感谢您帮我检查。 :-) 是的,即使我无法重现它。去年我遇到了这个问题,现在不知道它是如何自行解决的。不过我在 Spark 2.3 上工作。【参考方案2】:

我会检查底层 parquet 数据类型与您的 Hive 架构进行比较。 话虽如此,id、name、age 都是 hive 表中的字符串。 但是当你写出parquet时,id和age的数据类型可能是int而不是string。

【讨论】:

以上是关于如何将 txt 文件转换为 parquet 文件并将其加载到 hdfs table-pyspark的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spark 2.1.0 中使用 SparkSQL 将“.txt”转换为“.parquet”?

如何将 Parquet 文件转换为 Delta 文件

如何将 HDF5 文件转换为 Parquet 文件?

如何使用 AWS Glue 将许多 CSV 文件转换为 Parquet

如何将 csv 文件转换为镶木地板

将 Parquet 转换为 CSV