1

spark-sql을 사용하여 파일을 읽어야하고 파일이 현재 디렉토리에 있습니다.Spark-SQL : 현재 작업자 노드 디렉토리의 파일에 액세스합니다.

이 명령을 사용하여 HDFS에 저장된 파일의 목록을 압축 해제합니다.

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

파일은 현재 작업자 노드 디렉토리에 출력하고, 스칼라를 통해 "ls -a"!!을 실행 I 파일이 있음을 볼 수 있기 때문에 나는 이것을 알고있다.

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: [] 

을 그리고 나는 dataframe에서 열 'x'를 액세스하려고 할 때 발생합니다. HDFS에서 파일의 일부를 다운로드하고 로컬에서 압축을 풀고 테스트를 실행했기 때문에 'X'열이 있다는 것을 알고 있습니다.

1.6TB의 데이터를 가지고 있으므로 한 번에 압축을 풀고 나중에 액세스 할 수 없으므로 하나씩 파일 압축을 풀어야합니다.

작업자 노드 디렉토리로 출력되는 파일에 액세스하려면 무엇을 할 수 있습니까? 아니면 다른 방법으로해야할까요?

+0

이중 느낌표는 무엇입니까? –

+1

거꾸로 된 쉼표로 표시된 명령은 외부 시스템 명령으로 실행됩니다. –

답변

0

이전에 hadoop API를 사용하여 파일을 가져 왔지만 여기서 도움이된다면 알려지지 않았습니다.

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

그리고 아래를 테스트하지 않았했지만, 나는 불법 스칼라 자바 배열을 전달하고 있습니다 확신 해요. 그러나 그 후에해야할 일에 대한 아이디어를 제공하십시오.

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

그래서 나는 지금 그것을 할 수있었습니다. 내가하고있는 일은 파일을 HDFS에 저장 한 다음 hdfs를 통해 SQL 컨텍스트를 사용하여 파일을 검색하는 것이다. HDFS에서 매번 "out.las"를 덮어 씁니다. 너무 많은 공간을 차지하지 않습니다.