我正在尝试使用Spark将数据集加载到Hive表中。
但是当我尝试将文件从HDFS目录加载到Spark时,我得到了异常:
org.apache.spark.sql.AnalysisException: Path does not exist: file:/home/cloudera/partfile;
这些是加载文件之前的步骤。
val wareHouseLocation = "file:${system:user.dir}/spark-warehouse"
val SparkSession = SparkSession.builder.master("local[2]") \
.appName("SparkHive") \
.enableHiveSupport() \
.config("hive.exec.dynamic.partition", "true") \
.config("hive.exec.dynamic.partition.mode","nonstrict") \
.config("hive.metastore.warehouse.dir","/user/hive/warehouse") \
.config("spark.sql.warehouse.dir",wareHouseLocation).getOrCreate()
import sparkSession.implicits._
val partf = sparkSession.read.textFile("partfile")
声明的例外情况 - >
val partf = sparkSession.read.textFile("partfile")
org.apache.spark.sql.AnalysisException: Path does not exist: file:/home/cloudera/partfile;
但是我的文件位于HDFS的主目录中。
hadoop fs -ls
Found 1 items
-rw-r--r-- 1 cloudera cloudera 58 2017-06-30 02:23 partfile
我尝试了各种方法加载数据集,如:
val partfile = sparkSession.read.textFile("/user/cloudera/partfile") and
val partfile = sparkSession.read.textFile("hdfs://quickstart.cloudera:8020/user/cloudera/partfile")
但似乎没有任何效果。
我的火花版本是2.0.2
有谁能告诉我如何解决它?
答案 0 :(得分:0)
当您通过将master
设置为local[2]
来提交作业时,您的作业未提交给spark master,因此,spark不知道底层HDFS。
Spark会将本地文件系统视为其默认文件系统,这就是为什么在您的情况下会发生IOException。
尝试这种方式:
val SparkSession = SparkSession.builder \
.master("<spark-master-ip>:<spark-port>") \
.appName("SparkHive").enableHiveSupport() \
.config("hive.exec.dynamic.partition", "true") \
.config("hive.exec.dynamic.partition.mode","nonstrict") \
.config("hive.metastore.warehouse.dir","/user/hive/warehouse") \
.config("spark.sql.warehouse.dir",wareHouseLocation).getOrCreate()
import sparkSession.implicits._
val partf = sparkSession.read.textFile("partfile")
您需要了解<spark-master-ip>
和<spark-port>
。
这样,spark就会将底层的hdfs文件系统作为其默认文件系统。
答案 1 :(得分:0)
我不清楚显式协议规范会出现什么错误,但通常(已经回答)这意味着没有必要的配置传递到if(isTypeA){
new FetchUser(USERID){
@Override
protected void onPostExecute(User user){
mUser = user;
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
new FetchImages(mUser.getType()){
@Override
protected void onPostExecute(List<Image> result){
if(mImageList.isEmpty() && !result.isEmpty()){
mImageList.addAll(result);
mAdapter = new ItemAdapter(getChildFragmentManager(), mImageList.size(), mImageList);
mItemCardPager.setAdapter(mAdapter);
}else{
if(mMasterLayout != null){
mMasterLayout.setVisibility(View.GONE);
}
}
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
上下文。
第一个解决方案:
Spark
第二个:
在val sc = ??? // Spark Context
val config = sc.hadoopConfiguration
// you can mutate config object, it should work
config.addResource(new Path(s"${HADOOP_HOME}/conf/core-site.xml"))
// instead of adding a resource you can just specify hdfs address
// config.set("fs.defaultFS", "hdfs://host:port")
文件中明确指定HADOOP_CONF_DIR
。如果您计划使用群集,请确保群集中的每个节点都指定了$SPARK_HOME/spark-env.sh
。
确保在Spark / App类路径中拥有所有必需的Hadoop deps。
答案 2 :(得分:0)
尝试以下方法,它应该可以工作。
SparkSession session = SparkSession.builder().appName("Appname").master("local[1]").getOrCreate();
DataFrameReader dataFrameReader = session.read();
String path = "path\\file.csv";
Dataset <Row> responses = dataFrameReader.option("header","true").csv(path);