我需要使用spark-sql读取文件,该文件位于当前目录中。
我使用此命令解压缩我存储在HDFS上的文件列表。
val decompressCommand = Seq(laszippath, "-i", inputFileName , "-o", "out.las").!!
该文件在当前工作节点目录中输出,我知道这一点,因为通过scala执行"ls -a"!!
我可以看到文件在那里。然后我尝试使用以下命令访问它:
val dataFrame = sqlContext.read.las("out.las")
我假设sql上下文会尝试在当前目录中找到该文件,但它没有。此外,它不会抛出错误,但会发出警告,指出无法找到该文件(因此火花继续运行)。
我尝试使用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的数据,所以我不能一次解压缩它,以后再访问它们。
有谁能告诉我如何访问正在输出到工作节点目录的文件?或者我应该以其他方式做到这一点?
答案 0 :(得分:1)
所以我现在设法做到了。我正在做的是将文件保存到HDFS,然后通过hdfs使用sql上下文检索文件。我覆盖了#34; out.las"每次都在HDFS,这样我就不会占用太多空间。
答案 1 :(得分:0)
我之前使用过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)