首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spark HiveContext -从外部分区配置单元表分隔符读取问题

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

Stack Overflow用户
提问于 2016-08-20 09:47:59
回答 1查看 2.3K关注 0票数 2

我有一个外部分区Hive表,其下划线文件行格式的分隔字段以'|‘结尾,通过Hive直接读取数据是可以的,但当使用Spark的Dataframe API时,分隔符'|’不被考虑。

创建外部分区表:

代码语言:javascript
复制
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';

创建只包含一行的数据文件,并将其放到外部分区表位置:

代码语言:javascript
复制
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

使分区处于活动状态:

代码语言:javascript
复制
hive> alter table external_delimited_table add partition (year='2016',month='08',day='20');

健全性检查:

代码语言:javascript
复制
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 

Spark代码:

代码语言:javascript
复制
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()输出:

代码语言:javascript
复制
+-------+------+----+-----+---+
| value1|value2|year|month|day|
+-------+------+----+-----+---+
|one|two|  null|2016|   08| 20|
+-------+------+----+-----+---+
EN

回答 1

Stack Overflow用户

发布于 2016-08-22 04:39:44

这被证明是Spark版本1.5.0的一个问题。在版本1.6.0中不会发生问题:

代码语言:javascript
复制
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|
+------+------+----+-----+---+
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39049705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档