복붙노트

[HADOOP] Pyspark : HDFS 경로에있는 파일 / 디렉토리 목록 가져 오기

HADOOP

Pyspark : HDFS 경로에있는 파일 / 디렉토리 목록 가져 오기

제목과 같습니다. 나는 textFile을 알고 있지만 이름에서 알 수 있듯이 텍스트 파일에서만 작동합니다. HDFS (또는 로컬 경로)의 경로에있는 파일 / 디렉토리에 액세스해야합니다. 나는 pyspark를 사용하고있다.

도와 주셔서 감사합니다

해결법

  1. ==============================

    1.Spark은 데이터를로드 할 때 도메인이 시작되는 데이터 처리 도구로만 생각하면 도움이된다고 생각합니다. 여러 형식을 읽을 수 있으며 Hadoop glob 표현식을 지원합니다.이 표현식은 HDFS에서 여러 경로를 읽는 데 매우 유용하지만 디렉토리 나 파일을 탐색하는 데 대해 알고있는 기본 기능이 없으며 Hadoop 또는 HDFS와 상호 작용하는 유틸리티.

    Spark은 데이터를로드 할 때 도메인이 시작되는 데이터 처리 도구로만 생각하면 도움이된다고 생각합니다. 여러 형식을 읽을 수 있으며 Hadoop glob 표현식을 지원합니다.이 표현식은 HDFS에서 여러 경로를 읽는 데 매우 유용하지만 디렉토리 나 파일을 탐색하는 데 대해 알고있는 기본 기능이 없으며 Hadoop 또는 HDFS와 상호 작용하는 유틸리티.

    esutil 및 hdfs를 포함하여 원하는 것을 수행 할 수있는 몇 가지 도구가 있습니다. hdfs lib는 CLI와 API를 모두 지원하므로 바로 여기 'Python으로 HDFS 파일을 나열하는 방법'으로 바로 이동할 수 있습니다. 다음과 같이 보입니다.

    from hdfs import Config
    client = Config().get_client('dev')
    files = client.list('the_dir_path')
    
  2. ==============================

    2.JVM 게이트웨이를 사용하는 것은 그리 우아하지는 않지만, 어떤 경우 아래 코드가 도움이 될 수 있습니다.

    JVM 게이트웨이를 사용하는 것은 그리 우아하지는 않지만, 어떤 경우 아래 코드가 도움이 될 수 있습니다.

    URI           = sc._gateway.jvm.java.net.URI
    Path          = sc._gateway.jvm.org.apache.hadoop.fs.Path
    FileSystem    = sc._gateway.jvm.org.apache.hadoop.fs.FileSystem
    Configuration = sc._gateway.jvm.org.apache.hadoop.conf.Configuration
    
    
    fs = FileSystem.get(URI("hdfs://somehost:8020"), Configuration())
    
    status = fs.listStatus(Path('/some_dir/yet_another_one_dir/'))
    
    for fileStatus in status:
        print(fileStatus.getPath())
    
  3. ==============================

    3.PySpark를 사용한다면 대화식으로 명령을 실행할 수 있습니다 :

    PySpark를 사용한다면 대화식으로 명령을 실행할 수 있습니다 :

    선택한 디렉토리의 모든 파일 나열 :

    hdfs dfs -ls <경로> 예 : hdfs dfs -ls / user / path :

    import os
    import subprocess
    
    cmd = 'hdfs dfs -ls /user/path'
    files = subprocess.check_output(cmd, shell=True).strip().split('\n')
    for path in files:
      print path
    

    또는 선택한 디렉토리의 파일 검색 :

    hdfs dfs -find -name <표현식> 예 : hdfs dfs -find / user / path -name * .txt :

    import os
    import subprocess
    
    cmd = 'hdfs dfs -find {} -name *.txt'.format(source_dir)
    files = subprocess.check_output(cmd, shell=True).strip().split('\n')
    for path in files:
      filename = path.split(os.path.sep)[-1].split('.txt')[0]
      print path, filename
    
  4. ==============================

    4.디렉토리의 모든 파일을 읽으려면 sc.wholeTextFiles [doc]를 확인하십시오. 그러나 파일의 내용이 원하는 결과가 아닌 단일 행의 값으로 읽혀집니다.

    디렉토리의 모든 파일을 읽으려면 sc.wholeTextFiles [doc]를 확인하십시오. 그러나 파일의 내용이 원하는 결과가 아닌 단일 행의 값으로 읽혀집니다.

    일부 파일 만 읽으려면 경로 목록을 생성하고 (일반 hdfs ls 명령을 사용하여 필요한 필터링을 추가) sqlContext.read.text [doc]에 전달한 다음 DataFrame에서 RDD로 변환하는 것 같습니다. 최선의 접근 방식과 같습니다.

  5. ==============================

    5.snakebite 라이브러리를 사용하여이 작업을 수행하는 쉬운 방법이 있습니다.

    snakebite 라이브러리를 사용하여이 작업을 수행하는 쉬운 방법이 있습니다.

    from snakebite.client import Client
    
    hadoop_client = Client(HADOOP_HOST, HADOOP_PORT, use_trash=False)
    
    for x in hadoop_client.ls(['/']):
    
    ...     print x
    
  6. from https://stackoverflow.com/questions/35750614/pyspark-get-list-of-files-directories-on-hdfs-path by cc-by-sa and MIT license