【问题标题】:Spark-SQL: access file in current worker node directorySpark-SQL:访问当前工作节点目录中的文件
【发布时间】:2017-11-01 05:47:31
【问题描述】:

我需要使用 spark-sql 读取一个文件,该文件在当前目录中。

我使用此命令解压缩存储在 HDFS 上的文件列表。

val decompressCommand = Seq(laszippath, "-i", inputFileName , "-o", "out.las").!!

文件在当前worker节点目录下输出,我知道这是因为通过scala执行"ls -a"!!可以看到文件在那里。然后我尝试使用以下命令访问它:

val dataFrame = sqlContext.read.las("out.las")

我假设 sql 上下文会尝试在当前目录中查找文件,但事实并非如此。此外,它不会引发错误,而是会发出警告,指出找不到文件(因此 spark 继续运行)。

我尝试使用:sparkContext.addFile("out.las") 添加文件,然后使用:val location = SparkFiles.get("out.las") 访问该位置,但这也不起作用。

我什至运行了命令 val locationPt = "pwd"!!,然后运行了 val fullLocation = locationPt + "/out.las" 并尝试使用该值,但它也不起作用。

实际抛出的异常如下:

User class threw exception: org.apache.spark.sql.AnalysisException: cannot resolve 'x' given input columns: [];
org.apache.spark.sql.AnalysisException: cannot resolve 'x' given input columns: []

当我尝试从数据框中访问“x”列时会发生这种情况。我知道“X”列存在,因为我从 HDFS 下载了一些文件,在本地解压缩并运行了一些测试。

我需要一个一个解压文件,因为我有1.6TB的数据,所以我不能一次解压,以后再访问。

谁能告诉我如何访问输出到工作节点目录的文件?或者也许我应该以其他方式做这件事?

【问题讨论】:

  • 什么是双感叹号?
  • 引号内的命令作为外部系统命令执行。

标签: scala hadoop apache-spark apache-spark-sql spark-dataframe


【解决方案1】:

所以我现在设法做到了。我正在做的是将文件保存到 HDFS,然后通过 hdfs 使用 sql 上下文检索文件。我每次都在 HDFS 中覆盖“out.las”,这样我就不会占用太多空间。

【讨论】:

    【解决方案2】:

    我以前使用过 hadoop API 来获取文件,我不知道它是否能帮助你。

    val filePath = "/user/me/dataForHDFS/"
    val fs:FileSystem = FileSystem.get(new java.net.URI(filePath + "out.las"), sc.hadoopConfiguration)
    

    我还没有测试过以下内容,但我很确定我将 java 数组非法传递给 scala。但只是给出一个想法,然后再做什么。

    var readIn: Array[Byte] = Array.empty[Byte]
    val fileIn: FSDataInputStream = fs.open(file)
    val fileIn.readFully(0, readIn)
    

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多