原创

解决本地模式Scala调试spark无法读取本地文件报错

温馨提示:
本文最后更新于 2018年07月13日,已超过 2,205 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

解决本地模式Scala调试spark无法读取本地文件报错Caused by: java.net.URISyntaxException: Relative path in absolute URI:

错误示例:

解决办法:

使用盘符前面加上file:///本地文件传输协议就可以了。

什么是File协议

字面意思:本地文件传输协议

什么是File:

file协议主要用于访问本地计算机中的文件,好比通过Windows的资源管理器中打开文件或者通过右键单击‘打开’一样。

如何使用:

file协议的基本格式如下:

file:///文件路径

比如需要打开E盘下txt目录中的index.txt,那么在资源管理器或者浏览器地址栏中输入:file:///E:/txt/index.txt。用file:///+文件地址,其实等价于文件的地址。即:

file:///C:/Users/CLi/AppData/Local/Temp/WindowsLiveWriter1627300719/supfiles52F410/wangdan-se-436963[2].jpg 

等价于:

C:/Users/CLi/AppData/Local/Temp/WindowsLiveWriter1627300719/supfiles52F410/wangdan-se-436963[2].jpg 

点击并拖拽以移动

URI中问什么本地文件file后面跟三个斜杠?

URI的结构为:

scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]

如果有host,前面需要加//,因此对于http或https等网络地址来说会写成:

https://blog.csdn.net/lishanleilixin/article/category/7191777

点击并拖拽以移动

这样看上去很自然。如果是文件的话,文件没有host,所以中间的host部分就不要了,就变成了:

file:///lishanleilixin/article/category/7191777

因为如果没有host的话,第一个[]的内容就不存在了,这种同意的写法有一个标准叫CURIE。

测试文本:

E:/Code/BigData/spark-01-wordcount/src/main/File/a.txt

www.liuzhaopo.top
lewis.org.cn
liuzhaopo
lzhpo

www.liuzhaopo.top
lewis.org.cn
liuzhaopo
lzhpo

www.liuzhaopo.top
lewis.org.cn
liuzhaopo
lzhpo

scala代码:

package com.lzhpo.scala

import org.apache.spark.{SparkConf, SparkContext}

/**
  * <p>Create By IntelliJ IDEA</p>
  * <p>Author:lzhpo</p>
  */
object WordCountDemo {
  def main(args: Array[String]): Unit = {

    //创建Spark配置对象
    val conf = new SparkConf()
    conf.setAppName("WordCountSpark")
    //设置master属性
    conf.setMaster("local")

    //通过conf创建sc
    val sc = new SparkContext(conf);


    //加载文本文件
//    val rdd1 = sc.textFile("E:/Code/BigData/spark-01-wordcount/src/main/File/a.txt")
    //不使用file:///可能会报URL错,可能....
    val rdd1 = sc.textFile("file:///E:/Code/BigData/spark-01-wordcount/src/main/File/a.txt")
    //压扁
    val rdd2 = rdd1.flatMap(line => line.split(" "))
    //映射w => (w,1)
    val rdd3 = rdd2.map((_,1))
    val rdd4 = rdd3.reduceByKey(_ + _)
    val r = rdd4.collect()
    r.foreach(println)


  }
}

scala代码运行结果:

(liuzhaopo,3)
(lewis.org.cn,3)
(,2)
(lzhpo,3)
(www.liuzhaopo.top,3)

java代码:

package com.lzhpo.java;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import scala.Tuple2;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * <p>Create By IntelliJ IDEA</p>
 * <p>Author:lzhpo</p>
 */
public class WordCount {
    public static void main(String[] args) {
        //创建SparkConf对象
        SparkConf conf = new SparkConf();
        conf.setAppName("WordCountJava2");
        conf.setMaster("local");

        //创建java sc
        JavaSparkContext sc = new JavaSparkContext(conf);
        //加载文本文件
        JavaRDD<String> rdd1 = sc.textFile("file:///file:///E:/Code/BigData/spark-01-wordcount/src/main/File/a.txt");

        //压扁
        JavaRDD<String> rdd2 = rdd1.flatMap(new FlatMapFunction<String, String>() {
            public Iterator<String> call(String s) throws Exception {
                List<String> list = new ArrayList<String>();
                String[] arr = s.split(" ");
                for(String ss :arr){
                    list.add(ss);
                }
                return list.iterator();
            }
        });

        //映射,word -> (word,1)
        JavaPairRDD<String,Integer> rdd3 = rdd2.mapToPair(new PairFunction<String, String, Integer>() {
            public Tuple2<String, Integer> call(String s) throws Exception {
                return new Tuple2<String, Integer>(s,1);
            }
        });

        //reduce化简
        JavaPairRDD<String,Integer> rdd4 = rdd3.reduceByKey(new Function2<Integer, Integer, Integer>() {
            public Integer call(Integer v1, Integer v2) throws Exception {
                return v1 + v2;
            }
        });

        //
        List<Tuple2<String,Integer>> list = rdd4.collect();
        for(Tuple2<String, Integer> t : list){
            System.out.println(t._1() + " : " + t._2());
        }
    }
}

java运行结果:

liuzhaopo : 3
lewis.org.cn : 3
 : 2
lzhpo : 3
www.liuzhaopo.top : 3

参考:

https://www.cnblogs.com/lishanlei/p/9327646.html

https://stackoverflow.com/questions/38940312/why-does-spark-report-java-net-urisyntaxexception-relative-path-in-absolute-ur/38945867

本文目录