【问题标题】:How to transform a txt file into a parquet file and load it into a hdfs table-pyspark如何将 txt 文件转换为 parquet 文件并将其加载到 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")吗?

标签: apache-spark hive pyspark


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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-06
    • 2011-10-30
    • 1970-01-01
    • 2022-01-17
    • 2017-05-20
    • 2018-07-31
    • 2019-02-11
    • 2017-12-28
    相关资源
    最近更新 更多