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

镶木地板上的蜂巢外部表未获取数据

边翔宇
2023-03-14

我正在尝试创建一个数据管道,其中incomng数据存储在parquet中,我创建了一个外部配置单元表,用户可以查询配置单元表并检索数据。我可以保存parquet数据并直接检索它,但当我查询配置单元表格时,它不会返回任何行。我做了以下测试设置:

-创建外部配置单元表创建外部表emp ( id double,hire_dt时间戳,用户字符串)存储为parquet location '/test/EMP ';

现在在一些数据上创建了数据帧并保存到镶木地板。

---创建数据帧并插入数据

val employeeDf = Seq(("1", "2018-01-01","John"),("2","2018-12-01", "Adam")).toDF("id","hire_dt","user")
val schema = List(("id", "double"), ("hire_dt", "date"), ("user", "string"))
val newCols= schema.map ( x => col(x._1).cast(x._2)) 
val newDf = employeeDf.select(newCols:_*)
newDf.write.mode("append").parquet("/test/emp")
newDf.show 

--read the contents directly from parquet 
val sqlcontext=new org.apache.spark.sql.SQLContext(sc)
sqlcontext.read.parquet("/test/emp").show 

+---+----------+----+
| id|   hire_dt|user|
+---+----------+----+
|1.0|2018-01-01|John|
|2.0|2018-12-01|Adam|
+---+----------+----+

--read from the external hive table 
spark.sql("select  id,hire_dt,user from  emp").show(false)

+---+-------+----+
|id |hire_dt|user|
+---+-------+----+
+---+-------+----+

如上所示,如果我直接从镶木地板读取,但不能从蜂巢读取,我能够看到数据。问题是我在这里做错了什么?我做错了,蜂巢没有获取数据。我认为msck修复可能是一个原因,但如果我尝试做msck修复表说表未分区,我会得到错误。

共有3个答案

苗承
2023-03-14

sparkSession builder()语句中是否有enableHiveSupport()。您能够连接到hive metastore吗?尝试在代码中显示表/数据库,看看是否可以显示配置单元位置上的表。

公良昕
2023-03-14

除了下面Ramdev给出的答案之外,您还需要注意在日期/时间戳周围使用正确的数据类型;创建配置单元表时,parquet不支持“日期”类型。

为此,您可以将列'hire_dt'的'date'类型更改为'时间戳'。

否则,您在火花中坚持并尝试在蜂巢(或蜂巢SQL)中读取的数据将不匹配。在两个地方都将其保持为“时间戳”将解决问题。我希望它有所帮助。

龙亮
2023-03-14

根据创建表语句,您已将位置用作 /test/emp,但在写入数据时,您正在写入 /tenants/gwm/idr/emp。所以你不会在 /test/emp 上有数据。

创建外部配置单元表创建外部表emp ( id double,hire_dt时间戳,用户字符串)存储为parquet location '/test/EMP ';

请将外部表重新创建为

创建外部配置单元表创建外部表emp ( id double,hire_dt时间戳,用户字符串)存储为parquet location '/tenances/gwm/IDR/EMP ';

 类似资料:
  • 我试图创建一个Hive表与模式字符串,字符串,双在包含两个拼花文件的文件夹上。第一个拼花文件模式是字符串,字符串,双,第二个文件的模式是字符串,双,字符串。 我正在尝试使用pig(0.14)脚本中的hive表。 但我得到了错误 java.lang.UnsupportedOperationException:无法检查org.apache.hadoop.hive.serde2.io.DoubleWri

  • 我正在尝试将存储在HDFS(100Gbs)上的一堆多部分avro文件转换为拼花文件(保留所有数据) Hive可以使用以下命令将avro文件作为外部表读取: 但是当我试图设计一张拼花桌时: 它会抛出一个错误: 失败:执行错误,从org.apache.hadoop.hive.ql.exec.DDLTask返回代码1。java.lang.UnsupportedOperationException:未知字

  • 虽然 Impala 比 Hive 快得多,但我们之所以使用 Hive,是因为它支持复杂(嵌套)数据类型,如数组和映射。 我注意到,从CDH5.5开始,Impala现在支持复杂的数据类型。由于在黑斑羚中也可以运行蜂巢UDF,我们可能可以在黑斑中做任何我们想做的事情,但要快得多。这是个好消息! 当我浏览文档时,我看到Impala希望以镶木地板格式存储数据。我的数据,在原始形式中,恰好是一个两列的CSV

  • 我有一个数据帧,它是由运行特定日期的每日批处理创建的,然后保存在HDFS(Azure Data Lake Gen 2)中。 它是用这样的东西保存的 如您所见,我没有对数据帧进行分区,因为它只包含一个日期。 例如,第一天的第一个文件将存储在文件夹中 交易/2019/08/25 然后第二天,它就会在文件夹里 贸易/2019/08/26 问题是,当所有数据都放好后,日期上的过滤器谓词是否仍会被按下,HD

  • 我正在尝试动态(不在Hive DDL中列出列名和类型)在镶木地板数据文件上创建一个Hive外部表。我有底层镶木地板文件的Avro模式。 我尝试使用以下DDL: 我的 Hive 表是使用正确的架构成功创建的,但是当我尝试读取数据时: 我得到以下错误: 有没有一种方法可以成功地创建和读取Parquet文件,而不用在DDL中提到列名和类型列表?

  • 有没有一种方法可以直接从基于avro模式的parquet文件在Amazon Athena中创建表?模式被编码到文件中,所以我需要自己实际创建DDL看起来很愚蠢。 我看到了这个,还有另一个复制品 但它们与Hive直接相关,这对雅典娜不起作用。理想情况下,我正在寻找一种以编程方式执行此操作的方法,而无需在控制台上定义它。