oop файловая система открыла файл и пропустила первую строку - PullRequest
0 голосов
/ 21 января 2020

Я читаю файл в моей HDFS, используя язык Python.

У каждого файла есть заголовок, и я пытаюсь объединить файлы. Однако заголовок в каждом файле также объединяется.

Есть ли способ пропустить заголовок из второго файла?

hadoop = sc._jvm.org.apache.hadoop
conf = hadoop.conf.Configuration()
fs = hadoop.fs.FileSystem.get(conf)

src_dir = "/mnt/test/"
out_stream = fs.create(hadoop.fs.Path(dst_file), overwrite)

files = []
for f in fs.listStatus(hadoop.fs.Path(src_dir)):
  if f.isFile():
    files.append(f.getPath())

for file in files:
  in_stream = fs.open(file)
  hadoop.io.IOUtils.copyBytes(in_stream, out_stream, conf, False)

В настоящее время я решил проблему с приведенными ниже логами c, однако хотел бы знаете, есть ли лучшее и эффективное решение? ценим вашу помощь

for idx,file in enumerate(files):
            if debug: 
                print("Appending file {} into {}".format(file, dst_file))

            # remove header from the second file
            if idx>0:
              file_str = ""
              with open('/'+str(file).replace(':',''),'r+') as f:
                for idx,line in enumerate(f):
                  if idx>0:
                    file_str = file_str + line

              with open('/'+str(file).replace(':',''), "w+") as f:
                f.write(file_str)
            in_stream = fs.open(file)   # InputStream object and copy the stream
            try:
                hadoop.io.IOUtils.copyBytes(in_stream, out_stream, conf, False)     # False means don't close out_stream
            finally:
                in_stream.close()

1 Ответ

1 голос
/ 22 января 2020

То, что вы делаете сейчас, это добавление к строке несколько раз. Это довольно медленный процесс. Почему бы не записать непосредственно в выходной файл, как вы читаете?

for file_idx, file in enumerate(files):
  with open(...) as out_f, open(...) as in_f:
    for line_num, line in enumerate(in_f):
      if file_idx == 0 or line_num > 0:
        f_out.write(line)

Если вы можете загрузить файл сразу, вы также можете пропустить первую строку, используя readline, а затем readlines:

for file_idx, file in enumerate(files):
  with open(...) as out_f, open(...) as in_f:
    if file_idx != 0:
      f_in.readline()
    f_out.writelines(f_in.readlines())
...