如何将 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”?