gpt4 book ai didi

python - 一次 Spark.read() 多条路径,而不是 for 循环中的一条一条

转载 作者:行者123 更新时间:2023-12-04 10:00:46 24 4
gpt4 key购买 nike

我正在运行以下代码:

list_of_paths 是一个以 avro 文件结尾的路径列表。例如,

['folder_1/folder_2/0/2020/05/15/10/41/08.avro', 'folder_1/folder_2/0/2020/05/15/11/41/08.avro', 'folder_1/folder_2/0/2020/05/15/12/41/08.avro']

注意:以上路径存储在Azure Data Lake存储中,以下过程在Databricks中执行

spark.conf.set("fs.azure.account.key.{0}.dfs.core.windows.net".format(storage_account_name), storage_account_key)
spark.conf.set("spark.sql.execution.arrow.enabled", "false")
begin_time = time.time()

for i in range(len(list_of_paths)):

try:
read_avro_data,avro_decoded=None,None

#Read paths from Azure Data Lake "abfss"
read_avro_data=spark.read.format("avro").load("abfss://{0}@{1}.dfs.core.windows.net/{2}".format(storage_container_name, storage_account_name, list_of_paths[i]))

except Exception as e:
custom_log(e)

架构

read_avro_data.printSchema()

root
|-- SequenceNumber: long (nullable = true)
|-- Offset: string (nullable = true)
|-- EnqueuedTimeUtc: string (nullable = true)
|-- SystemProperties: map (nullable = true)
| |-- key: string
| |-- value: struct (valueContainsNull = true)
| | |-- member0: long (nullable = true)
| | |-- member1: double (nullable = true)
| | |-- member2: string (nullable = true)
| | |-- member3: binary (nullable = true)
|-- Properties: map (nullable = true)
| |-- key: string
| |-- value: struct (valueContainsNull = true)
| | |-- member0: long (nullable = true)
| | |-- member1: double (nullable = true)
| | |-- member2: string (nullable = true)
| | |-- member3: binary (nullable = true)
|-- Body: binary (nullable = true)
# this is the content of the AVRO file.

行数和列数

print("ROWS: ", read_avro_data.count(), ", NUMBER OF COLUMNS: ", len(read_avro_data.columns))

ROWS: 2 , NUMBER OF COLUMNS: 6

我想要的是每次迭代读取 1 个 AVRO 文件,因此一次迭代读取 2 行内容。相反,我想一次读取所有 AVRO 文件。所以在我最终的 spark DataFrame 中有 2x3 = 6 行内容。

这对 spark.read() 可行吗?类似于以下内容:

spark.read.format("avro").load("abfss://{0}@{1}.dfs.core.windows.net/folder_1/folder_2/0/2020/05/15/*")

[更新] 对通配符(*)的误解表示抱歉。这意味着所有 AVRO 文件都在同一个文件夹中。但是,每个 AVRO 文件我有 1 个文件夹。所以 3 个 AVRO 文件,3 个文件夹。在这种情况下,通配符将不起作用。下面回答的解决方案是使用带有路径名的列表 []。

提前感谢您的帮助和建议。

最佳答案

load(path=None, format=None, schema=None, **options) 此方法将接受单个路径或路径列表。

例如,您可以像下面这样直接传递路径列表

spark.read.format("avro").load(["/tmp/dataa/userdata1.avro","/tmp/dataa/userdata2.avro"]).count()

1998

关于python - 一次 Spark.read() 多条路径,而不是 for 循环中的一条一条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61833307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com