dataframereader如何读取http?

时间:2017-09-07 16:25:49

标签: scala apache-spark intellij-idea apache-spark-sql hdfs

我的发展环境:

  • Intellij
  • Maven
  • Scala2.10.6
  • win7 x64

依赖关系:

 <dependencies>
    <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core_2.10 -->
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.10</artifactId>
        <version>2.2.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-mllib_2.10 -->
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-mllib_2.10</artifactId>
        <version>2.2.0</version>
        <scope>provided</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-sql_2.10 -->
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.10</artifactId>
        <version>2.2.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.scala-lang/scala-library -->
    <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-library</artifactId>
        <version>2.10.6</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.scala-lang/scala-reflect -->
    <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-reflect</artifactId>
        <version>2.10.6</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.7.4</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <version>2.7.4</version>
    </dependency>
</dependencies>

问题:
我想将远程csv文件读入数据帧 我接下来试过了:

val weburl = "http://myurl.com/file.csv"
val tfile = spark.read.option("header","true").option("inferSchema","true").csv(weburl)

它返回下一个错误:

Exception in thread "main" java.io.IOException: No FileSystem for scheme: http

我在网上搜索后尝试了下一步(包括stackoverflow)

val content = scala.io.Source.fromURL(weburl).mkString
val list = content.split("\n")
//...doing something to string and typecase, seperate each lows to make dataframe format.

它运行正常,但我认为加载Web源csv文件更加智能 有没有办法让DataframeReader可以读取HTTP csv?

我认为设置SparkContext.hadoopConfiguration是一些关键,所以我在互联网上尝试了很多代码。但它没有工作,我不知道如何设置和代码行的每个含义。

接下来是我的尝试之一,它没有工作。(访问&#34; http&#34;相同的错误信息)

val sc = new SparkContext(spark_conf)
val spark = SparkSession.builder.appName("Test").getOrCreate()
val hconf = sc.hadoopConfiguration


hconf.set("fs.hdfs.impl", classOf[org.apache.hadoop.hdfs.DistributedFileSystem].getName)
hconf.set("fs.file.impl", classOf[org.apache.hadoop.fs.LocalFileSystem].getName)
hconf.set("fs.file.impl", classOf[org.apache.hadoop.fs.LocalFileSystem].getName)

设定这是关键吗?或不? 或者DataframeReader无法直接从远程源读取?我怎么能这样做? 我需要为http格式导入一些特殊的库吗?

我想知道的事情

有没有办法让dataframereader可以读取HTTP源? 不使用自己的解析数据。 (例如 Best way to convert online csv to dataframe scala。)
我需要阅读CSV格式。 CSV是正式格式。我认为更通用的方式来读取像dataframereader.csv("local file")这样的数据。

我知道这个问题太低了。对不起,我的理解水平很低。

1 个答案:

答案 0 :(得分:5)

据我所知,无法直接读取HTTP数据。您可以做的最简单的事情是使用# "local" is for Unix domain socket connections only local all all trust # IPv4 local connections: host all all 127.0.0.1/32 trust # IPv6 local connections: host all all ::1/128 trust # Allow replication connections from localhost, by a user with the # replication privilege. #local replication postgres trust #host replication postgres 127.0.0.1/32 trust #host replication postgres ::1/128 trust 下载文件,但它会将数据复制到每个工作人员:

$ ls -la /var/run/postgresql/
total 4
drwxrwsr-x  2 postgres postgres  80 Sep  7 19:52 .
drwxr-xr-x 18 root     root     560 Sep  7 16:22 ..
srwxrwxrwx  1 postgres postgres   0 Sep  7 19:52 .s.PGSQL.5432
-rw-------  1 postgres postgres  69 Sep  7 19:52 .s.PGSQL.5432.lock

就我个人而言,我只是提前下载文件并放入分布式存储。