当前位置: 首页 > 知识库问答 >
问题:

使用 Scala 数据帧中的分区创建配置单元表

梁勇
2023-03-14

我需要一种从Scala数据框创建hive表的方法。hive表应该具有按日期分区的S3位置的ORC格式的基础文件。

以下是我目前得到的信息:

我以 ORC 格式将 scala 数据帧写入 S3

df.write.format("orc").partitionBy("date").save("S3Location)

我可以在S3位置看到ORC文件。我现在在这些ORC文件的顶部创建了一个配置单元表:

CREATE EXTERNAL TABLE "tableName"(columnName string)
PARTITIONED BY (date string)
STORED AS ORC
LOCATION "S3Location"
TBLPROPERTIES("orc.compress"="SNAPPY")

但是配置单元表是空的,即 spark.sql(“从 db.tableName 中选择 *”)不打印任何结果。

但是,当我删除< code>PARTITIONED BY行时:

CREATE EXTERNAL TABLE "tableName"(columnName string, date string)
STORED AS ORC
LOCATION "S3Location"
TBLPROPERTIES("orc.compress"="SNAPPY")

我看到了选择查询的结果。

似乎hive不认可spark创建的分区。我用的是Spark 2.2.0。

任何建议将不胜感激。

更新:

我从一个火花数据框开始,我只需要一种方法来在此之上创建一个蜂巢表(底层文件在S3位置为ORC格式)。

共有1个答案

西门靖琪
2023-03-14

我认为分区还没有添加到hive元存储中,所以你只需要运行这个hive命令:

MSCK REPAIR TABLE table_name

如果不起作用,可能需要检查以下几点:

  • 将数据写入s3后,文件夹应如下:s3://anypath youwant/mytablefolder/transaction_date=2020-10-30
  • 创建外部表时,位置应该指向s3://anypath youwant/mytablefile

是的,Spark 将数据写入 s3,但不会将分区定义添加到配置单元元存储中!Hive 不知道写入的数据,除非它们位于可识别的分区下。因此,要检查配置单元元存储中的分区,可以使用以下配置单元命令:

SHOW PARTITIONS tablename

在生产环境中,我不推荐使用< code>MSCK修理表来达到这个目的,因为它会耗费太多的时间。最好的方法是让您的代码通过rest api只将新创建的分区添加到您的metastore。

 类似资料:
  • 我对spark数据帧的分区数量有疑问。 如果我有包含列(姓名、年龄、id、位置)的Hive表(雇员)。 如果雇员表有10个不同的位置。因此,在HDFS中将数据划分为10个分区。 如果我通过读取 Hive 表(员工)的整个数据来创建 Spark 数据帧(df)。 Spark 将为数据帧 (df) 创建多少个分区? df.rdd.partitions.size = ??

  • 这是将Spark dataframe保存为Hive中的动态分区表的后续操作。我试图在答案中使用建议,但无法在Spark 1.6.1中使用 任何推动这一进程的帮助都是感激的。 编辑:还创建了SPARK-14927

  • 1-创建了源表 2-将数据从本地加载到源表 3-创建了另一个带有分区的表-partition_table 我不确定如何在外部表中进行分区。有人能帮我一步一步地描述一下吗?。

  • 我找不到以上两种方式有什么不同。有人能给我解释一下或者指导我正确的材料吗?

  • 当然,希望有人能帮助我创建外部配置单元分区表,方法是根据HDFS目录中的逗号分隔文件自动添加数据。我的理解(或缺乏理解)是,当您定义一个已分区的CREATE外部表并为其提供一个位置时,它应该递归地扫描/读取每个子目录,并将数据加载到新创建的已分区的外部表中。下面的内容应该会对我的烦恼提供一些更多的了解… 每个'dt='子目录都包含分隔的文件。