Spark:无法从配置单元表中读取数据
Spark: Not able to read data from hive tables
我已经创建了一个 Maven 项目 pom.xml
<spark.version>1.3.0</spark.version>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>${spark.version}</version>
<exclusions>
<exclusion>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<!-- <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency> -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
</dependencies>
我的 class 正在从配置单元读取数据 table :
import org.apache.spark.sql.SQLContext
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.sql.DataFrame
class SparkHive {
def createTable = {
val conf = new SparkConf().setMaster("local").setAppName("My First spark app")
val sparkCtxt = new SparkContext(conf)
val hiveContext = new HiveContext(sparkCtxt)
hiveContext.setConf("hive.metastore.uris", "thrift://127.0.0.1:9083")
val table = hiveContext.sql("select * from test")
table.show()
val gpData = table.groupBy("col1")
println(gpData.max("col2").show())
}
}
我正在使用 spark 从存在于 hive metatore 中的 table 读取数据,但面临一个非常奇怪的问题。
我有两个问题,如下所述:
问题 1. 如果我使用 <spark.version>1.3.0</spark.version>
spark 能够找到 hive table 并且它能够在控制台的帮助下打印数据这条线
val table = hiveContext.sql("select * from test")
table.show()
但是如果我按照示例所示进行过滤或分组,spark 找不到 col1
并抛出如下异常
Exception in thread "main" java.util.NoSuchElementException: key not found: col1#0
所以问题是为什么如果数据框能够找到 table 那么为什么它不让我对列进行分组以及如何解决这个问题?
问题 2. 如果我使用 <spark.version>1.6.0</spark.version>
那么 spark 甚至无法找到 hive metastore 中存在的 table 那么现在为什么会出现这种行为? ??
环境:CLOUDERA QUICKSTART VM 5.8.0
试试这个:-
def createTable = {
val conf = new SparkConf().setMaster("local").setAppName("My First spark app")
val sparkCtxt = new SparkContext(conf)
val hiveContext = new HiveContext(sparkCtxt)
hiveContext.setConf("hive.metastore.uris", "thrift://127.0.0.1:9083")
val table = hiveContext.sql("select * from test")
table.show()
table.registerTempTable("table")
val gpData = hiveContext.sql("select max(col2) from table group by col1")
println(gpData.show())
}
}
他们唯一的技巧是将 hive-site.xml 放在类路径中。
我已经创建了一个 Maven 项目 pom.xml
<spark.version>1.3.0</spark.version>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>${spark.version}</version>
<exclusions>
<exclusion>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<!-- <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency> -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
</dependencies>
我的 class 正在从配置单元读取数据 table :
import org.apache.spark.sql.SQLContext
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.sql.DataFrame
class SparkHive {
def createTable = {
val conf = new SparkConf().setMaster("local").setAppName("My First spark app")
val sparkCtxt = new SparkContext(conf)
val hiveContext = new HiveContext(sparkCtxt)
hiveContext.setConf("hive.metastore.uris", "thrift://127.0.0.1:9083")
val table = hiveContext.sql("select * from test")
table.show()
val gpData = table.groupBy("col1")
println(gpData.max("col2").show())
}
}
我正在使用 spark 从存在于 hive metatore 中的 table 读取数据,但面临一个非常奇怪的问题。
我有两个问题,如下所述:
问题 1. 如果我使用 <spark.version>1.3.0</spark.version>
spark 能够找到 hive table 并且它能够在控制台的帮助下打印数据这条线
val table = hiveContext.sql("select * from test")
table.show()
但是如果我按照示例所示进行过滤或分组,spark 找不到 col1
并抛出如下异常
Exception in thread "main" java.util.NoSuchElementException: key not found: col1#0
所以问题是为什么如果数据框能够找到 table 那么为什么它不让我对列进行分组以及如何解决这个问题?
问题 2. 如果我使用 <spark.version>1.6.0</spark.version>
那么 spark 甚至无法找到 hive metastore 中存在的 table 那么现在为什么会出现这种行为? ??
环境:CLOUDERA QUICKSTART VM 5.8.0
试试这个:-
def createTable = {
val conf = new SparkConf().setMaster("local").setAppName("My First spark app")
val sparkCtxt = new SparkContext(conf)
val hiveContext = new HiveContext(sparkCtxt)
hiveContext.setConf("hive.metastore.uris", "thrift://127.0.0.1:9083")
val table = hiveContext.sql("select * from test")
table.show()
table.registerTempTable("table")
val gpData = hiveContext.sql("select max(col2) from table group by col1")
println(gpData.show())
}
}
他们唯一的技巧是将 hive-site.xml 放在类路径中。