복붙노트

[HADOOP] 파이썬을 사용하여 하이브 쿼리 출력에서 ​​인쇄 빈 줄을 제거

HADOOP

파이썬을 사용하여 하이브 쿼리 출력에서 ​​인쇄 빈 줄을 제거

난 하이브 쿼리를 수행하여 로컬 FS에서 TSV 파일의 출력을 저장하고있다. 나는 하이브 쿼리에 대한 루프를 실행하고 다른 매개 변수를 전달하고있다. 하이브 쿼리가 루프에 대해 한 번 더 출력을 반환하지 않으면 그것은 TSV 파일에 빈 줄을 인쇄합니다. 이 NULL 값이 백엔드 내 DB에 푸시됩니다. for 루프는 실행 파일이 생성 된 후 따라서, - 내가 인쇄 된 모든 빈 줄을 제거하는 아래의 코드를 가지고 있지만, 그것은 작동하지 않습니다.

어떻게하면이 파일에서 빈 줄을 제거 할 수 있습니까?

` 395.9   429.61  PT  
                       `

암호:

with open('file.tsv','r+w') as file:
        for line in file:
          if line.strip():
            file.write(line)

감사

해결법

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

    1.보통은 입력 파일을 열고 두 번째 파일에 비어 있지 않은 라인을 작성합니다 :

    보통은 입력 파일을 열고 두 번째 파일에 비어 있지 않은 라인을 작성합니다 :

    with open('file.tsv') as infile, open('filtered_file.tsv', 'w') as outfile:
        for line in infile:
            if line.strip():
                outfile.write(line)
    

    당신은 당신이 올바른 위치 옵션을 사용하여 파일 입력을 사용할 수있는 위치에 파일을 필터링하려면 :

    import fileinput
    for line in fileinput.FileInput("infile", inplace=1):
        if line.strip():
            print line
    

    그러나,이 중간 파일을 사용하고 디스크 공간 부족 상황에서 작동하지 않을 수 있습니다.

    당신이 뭔가를 시도 할 수있는 추가 디스크 공간을 할당하지 않고 파일의 올바른 위치를 필터링하려면 :

    with open('file.tsv', 'r+') as infile:
        read_pos = write_pos = 0
        line = infile.readline()
        while line:
            read_pos += len(line)
            if line.strip():
                infile.seek(write_pos)
                infile.write(line)
                write_pos += len(line)
            infile.seek(read_pos)
            line = infile.readline()
        # update file size to the new, possibly reduced, size
        infile.truncate(write_pos)
    
  2. from https://stackoverflow.com/questions/24196181/remove-empty-line-printed-from-hive-query-output-using-python by cc-by-sa and MIT license