正如 Headers 所说,我想用凤凰保存我的DataFrame . 我在scala上有一个spark代码,我在intellij IDEA上运行 . 这很简单:
import org.apache.spark.sql.SparkSession
import org.apache.phoenix.spark._
object MainTest extends App {
val sparkSession = SparkSession.builder()
.config("spark.sql.warehouse.dir", "file:///c:/tmp/spark-warehouse")
.master("local[*]")
.appName("spark-to-hbase")
.getOrCreate()
val sc = sparkSession.sparkContext
val sqlC = sparkSession.sqlContext
import sqlC.implicits._
val myRdd = sc.parallelize(List(("a",1), ("b", 2)))
myRdd.collect.foreach(println)
val myDf = myRdd.toDF("column1", "column2")
myDf.show()
myDf.saveToPhoenix("MY_TABLE", zkUrl = Some("localhost:16000"))
}
我还有一个HBase数据库在端口16000上运行在同一台PC上 . 问题在于该行
myDf.saveToPhoenix("MY_TABLE", zkUrl = Some("localhost:16000"))
抛出此异常:
线程“main”中的异常java.lang.NoClassDefFoundError:org / apache / hadoop / hbase / types / DataType at java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClass(ClassLoader.java:763 )java.net上的java.net.URLClassLoader.defineClass(URLClassLoader.java:467)java.net.URLClassLoader.access $ 100(URLClassLoader.java:73)的java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) . net.URLClassLoader $ 1.run(URLClassLoader.java:368)java.net.URLClassLoader $ 1.run(URLClassLoader.java:362)java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass( URLClassLoader.java:361)at java.lang.ClassLoader.loadClass(ClassLoader.java:424)at sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:335)at java.lang.ClassLoader.loadClass(ClassLoader.java) :357)org.apache.phoenix.spark.DataFrameFunctions $$ anonfun $ getFieldArray $ 2.apply(DataFrameFunctions.scala:72)at org.apache.phoenix.spark.DataFrameFunctions $$ anonfun $ getFi eldArray $ 2.apply(DataFrameFunctions.scala:72)at scala.collection.TraversableLike $$ anonfun $ map $ 1.apply(TraversableLike.scala:234)at scala.collection.TraversableLike $$ anonfun $ map $ 1.apply(TraversableLike.scala :234)scala.collection.IndexedSeqOptimized $ class.foreach(IndexedSeqOptimized.scala:33)at scala.collection.mutable.ArrayOps $ ofRef.foreach(ArrayOps.scala:186)at scala.collection.TraversableLike $ class.map( TraversableLike.scala:234)位于org.apache.phoenix.phoenix的org.apache.phoenix.phoenix.spark.DataFrameFunctions.getFieldArray(DataFrameFunctions.scala:72)的scala.collection.mutable.ArrayOps $ ofRef.map(ArrayOps.scala:186)主题测试中的.spark.DataFrameFunctions.saveToPhoenix(DataFrameFunctions.scala:35)$ .detaedEndpoint $ MainTest $ 1(MainTest.scala:23),位于scala.Function0 $ class的MainTest $ delayedInit $ body.apply(MainTest.scala:8) . 在scala.r $$上应用$ mcV $ sp(Function0.scala:34)scala.runtime.AbstractFunction0.apply $ mcV $ sp(AbstractFunction0.scala:12)$ anonfun $ main $ 1.apply(App.scala:76)在scala.App $$ an onfun $ main $ 1.apply(App.scala:76)at scala.collection.immutable.List.foreach(List.scala:381)at scala.collection.generic.TraversableForwarder $ class.foreach(TraversableForwarder.scala:35)at at MainTest.main(MainTest.scala)中的MainTest $ .main(MainTest.scala:8)中的scala.App $ class.main(App.scala:76)引起:java.lang.ClassNotFoundException:org.apache.hadoop . java.net.URLClassLoader.findClass(URLClassLoader.java:381)中的hbase.types.DataType,位于sun.misc.Launcher的java.lang.ClassLoader.loadClass(ClassLoader.java:424)$(AppClassLoader.loadClass)(Launcher.java: 335)at java.lang.ClassLoader.loadClass(ClassLoader.java:357)... 33更多
从我的理解,似乎java找不到一些类 . 我能做什么 ?
我的SBT:
name := "spark-to-hbase"
version := "1.0"
scalaVersion := "2.11.8"
libraryDependencies ++= Seq(
"org.apache.hadoop" % "hadoop-mapreduce-client-core" % "2.3.0",
"org.apache.phoenix" % "phoenix-core" % "4.11.0-HBase-1.3",
"org.apache.spark" % "spark-core_2.11" % "2.1.1",
"org.apache.spark" % "spark-sql_2.11" % "2.1.1",
"org.apache.phoenix" % "phoenix-spark" % "4.11.0-HBase-1.3"
)
2 回答
方法
saveToPhoenix
采用RDD . 对于数据框架,请使用save
(有关详细信息,请参阅此doc):我找到了解决问题的方法 . 正如例外所述,我的编译器无法找到类HBaseConfiguration . HBaseConfiguration在org.apache.hadoop.hbase库中使用,因此需要编译 . 我注意到我认为org.apache.hadoop库中没有HBaseConfiguration类 . 对于我的PC计算机上安装的hbase 1.3.1版本,我设法在位于HBASE_HOME / lib文件夹中的hbase-common-1.3.1 jar中找到该类 .
然后我在build.SBT中包含这个依赖项:
而且例外消失了 .