1

我有 1.3GB 的 Zip 文件,里面有一个 6GB 的逗号分隔格式的 txt 文件。此 zip 文件夹位于 Azure Data Lake Storage 上,并使用服务原理,它安装在 DBFS Databricks 文件系统上。使用普通 python 代码提取 6GB 文件时,我得到 1.98GB 作为提取文件。

请建议一种直接读取 txt 文件并将其存储为 spark Dataframe 的方法。

我曾尝试使用 python 代码,但直接从 python 读取会出错 - Error tokenizing data. C error: Expected 2 fields in line 371看到 3 这也是使用UTF-16-LE编码修复的,但之后出现错误 -ConnectException: Connection refused (Connection refused) on Databricks while trying to display the df.head().

import pandas as pd
import zipfile

zfolder = zipfile.ZipFile('dbfszipath') 
zdf = pd.read_csv(zfolder.open('6GBtextfile.txt'),error_bad_lines=False,encoding='UTF-16-LE')
zdf.head()

提取代码 -

import pandas as pd
import zipfile

zfolder = zipfile.ZipFile('/dbfszippath')
zfolder.extract(dbfsexrtactpath) 

当直接通过 zip 文件夹读取时,数据框应该包含所有数据,并且它应该显示一些数据并且不应该挂起 Databricks 集群。需要 Scala 或 Pyspark 中的选项。

4

1 回答 1

0

连接被拒绝来自 Databricks 和 spark 的内存设置。您将不得不增加尺寸限额以避免此错误。

from pyspark import SparkContext
from pyspark import SparkConf
from pyspark.sql import SQLContext

conf=SparkConf()
conf.set("spark.executor.memory", "4g")
conf.set("spark.driver.memory", "4g")

在这种情况下,分配的内存为 4GB,因此请根据需要进行更改。

另一种解决方案如下:

import zipfile
import io

def zip_extract(x):
    in_memory_data = io.BytesIO(x[1])
    file_obj = zipfile.ZipFile(in_memory_data, "r")
    files = [i for i in file_obj.namelist()]
    return dict(zip(files, [file_obj.open(file).read() for file in files]))


zips = sc.binaryFiles("somerandom.zip")
files_data = zips.map(zip_extract)

让我知道这是否有效或在这种情况下错误是什么。

[资源]

于 2019-09-22T01:23:05.043 回答