我正在尝试创建一个数据管道,将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修复表说表未分区,则会出错。
答案 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|
+---+----------+----+