实木复合地板上的配置单元外部表未获取数据

时间:2018-12-13 18:52:30

标签: apache-spark hive apache-spark-sql hiveql parquet

我正在尝试创建一个数据管道,将incomng数据存储到镶木地板中,然后创建和外部配置单元表,用户可以查询配置单元表并检索数据。我能够保存镶木地板数据并直接将其检索,但是当我查询配置单元表其不返回任何行。我做了以下测试设置

-创建外部HIVE表 创建外部表emp( id双 hire_dt时间戳, 用户字符串 ) 储存为实木复合地板 位置“ / 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修复表说表未分区,则会出错。

4 个答案:

答案 0 :(得分:0)

基于您的create table语句,您已将location用作/ test / emp,但在写入数据时,您正在/ tenants / gwm / idr / emp进行写入。因此,您将不会在/ test / emp获得数据。

CREATE EXTERNAL HIVE TABLE创建外部表emp(id为double,hire_dt时间戳,用户字符串),存储为实木复合地板位置'/ test / emp';

请重新创建外部表为

CREATE EXTERNAL HIVE TABLE创建存储在实木复合地板位置'/ tenants / gwm / idr / emp'的外部表emp(id double,hire_dt时间戳,用户字符串);

答案 1 :(得分:0)

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

为此,您可以将列“ date”的“ hire_dt”类型更改为“ timestamp”。

否则,您通过spark保留并尝试读取配置单元(或配置单元SQL)的数据将不匹配。在两个地方都将其设置为“时间戳”将解决此问题。希望对您有所帮助。

答案 2 :(得分:0)

sparkSession builder()语句中是否具有enableHiveSupport()。您是否可以连接到Hive Metastore?尝试在代码中显示表/数据库,看看是否可以显示配置单元中存在的表?

答案 3 :(得分:0)

我在chgn下使用了此功能。

val dfTransformed = employeeDf.withColumn("id", employeeDf.col("id").cast(DoubleType))
            .withColumn("hire_dt", employeeDf.col("hire_dt".cast(TimestampType))

因此,基本上,问题在于数据类型不匹配以及强制转换的原始代码似乎不起作用。所以我做了一个显式的转换,然后写得很好,也能够查询回来。逻辑上两者都在做同样的事情,不确定为什么原始代码不起作用。

val employeeDf = Seq(("1", "2018-01-01","John"),("2","2018-12-01", "Adam")).toDF("id","hire_dt","user")

val dfTransformed = employeeDf.withColumn("id", employeeDf.col("id").cast(DoubleType))
    .withColumn("hire_dt", employeeDf.col("hire_dt".cast(TimestampType))

dfTransformed.write.mode("append").parquet("/test/emp")
dfTransformed.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|
+---+----------+----+
|1.0|2018-01-01|John|
|2.0|2018-12-01|Adam|
+---+----------+----+