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

Spark HiveContext-读取外部分区配置单元表分隔符问题

翁文康
2023-03-14

我有一个外部分区配置单元表,下面的文件行格式分隔字段以“通过配置单元直接读取数据就可以了,但是当使用Spark的Dataframe API时,分隔符”没有被考虑在内。

创建外部分区表:

hive> create external table external_delimited_table(value1 string, value2 string)
partitioned by (year string, month string, day string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
location '/client/edb/poc_database/external_delimited_table';
shell>echo "one|two" >> table_data.csv
shell>hadoop fs -mkdir -p /client/edb/poc_database/external_delimited_table/year=2016/month=08/day=20
shell>hadoop fs -copyFromLocal table_data.csv /client/edb/poc_database/external_delimited_table/year=2016/month=08/day=20
hive> alter table external_delimited_table add partition (year='2016',month='08',day='20');
hive> select * from external_delimited_table;
select * from external_delimited_table;
+----------------------------------+----------------------------------+--------------------------------+---------------------------------+-------------------------------+--+
| external_delimited_table.value1  | external_delimited_table.value2  | external_delimited_table.year  | external_delimited_table.month  | external_delimited_table.day  |
+----------------------------------+----------------------------------+--------------------------------+---------------------------------+-------------------------------+--+
| one                              | two                              | 2016                           | 08                              | 20 
import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.{SparkContext, SparkConf}
object TestHiveContext {

  def main(args: Array[String]): Unit = {

    val conf = new SparkConf().setAppName("Test Hive Context")

    val spark = new SparkContext(conf)
    val hiveContext  = new HiveContext(spark)

    val dataFrame: DataFrame = hiveContext.sql("SELECT * FROM external_delimited_table")
    dataFrame.show()

    spark.stop()
  }

dataframe.show()输出:

+-------+------+----+-----+---+
| value1|value2|year|month|day|
+-------+------+----+-----+---+
|one|two|  null|2016|   08| 20|
+-------+------+----+-----+---+

共有1个答案

越运锋
2023-03-14

这是Spark版本1.5.0的一个问题。在1.6.0版本中,不会发生以下问题:

scala> sqlContext.sql("select * from external_delimited_table")
res2: org.apache.spark.sql.DataFrame = [value1: string, value2: string, year: string, month: string, day: string]

scala> res2.show
+------+------+----+-----+---+
|value1|value2|year|month|day|
+------+------+----+-----+---+
|   one|   two|2016|   08| 20|
+------+------+----+-----+---+
 类似资料:
  • 我有一个map reduce作业,它已经使用配置单元分区命名约定将记录写入hdfs。 如 有没有一种方法可以让hive自动识别分区(不需要执行插入查询)?

  • 当使用外部配置单元表时,是否有一种方法可以删除目录中的数据,但通过查询保留分区。请注意,我不想删除表并重新创建它。我只想清空底层文件夹并重新启动一个进程。我的表很大,按年、月、日期和小时划分分区,手动重新创建分区需要大量时间。 谢谢

  • 我有一个复杂的/嵌套的配置单元外部表,它是在HDFS顶部创建的(文件是avro格式的)。当我运行配置单元查询时,它会显示所有记录和分区。 然而,当我在Spark中使用相同的表时: 请注意,当我查看数据时,分区列不是底层保存数据的一部分,但当我通过hive查询表时,我可以看到它。当我尝试使用PySpark加载avro文件时,我也可以看到分区列: 所以我想知道那是什么样子?

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

  • 我有一个简单的配置单元-外部表,它是在S3的顶部创建的(文件是CSV格式的)。当我运行配置单元查询时,它会显示所有记录和分区。 但是,当我在Spark中使用相同的表时(Spark SQL在分区列上有where条件),它并没有显示应用了分区筛选器。然而,对于配置单元托管表,Spark能够使用分区信息并应用分区筛选器。 是否有任何标志或设置可以帮助我利用Spark中Hive外部表的分区?谢了。

  • 但是我得到了这个错误: sparkException:由于阶段失败而中止作业:阶段0.0中的任务236失败4次,最近的失败:阶段0.0中丢失任务236.3(TID 287,server,executor 17):org.apache.hadoop.security.AccessControlException:权限被拒绝:user=user,access=read,inode=“/path-to-