Synapse 笔记本存储 csv 作为文件夹格式

Synapse notebook storage csv as a folder format

我正在使用 Azure Synapse Notebook 使用以下代码将 spark 数据帧作为 csv 文件存储在 blob 存储中:

def pandas_to_spark(pandas_df):
    columns = list(pandas_df.columns)
    types = list(pandas_df.dtypes)
    struct_list = []
    for column, typo in zip(columns, types): 
      struct_list.append(define_structure(column, typo))
    p_schema = StructType(struct_list)
    return sqlContext.createDataFrame(pandas_df, p_schema)

def define_structure(string, format_type):
    try: typo = equivalent_type(format_type)
    except: typo = StringType()
    return StructField(string, typo)


csvString = str(r_csv.content.decode('latin-1'))
csvString = csvString.replace('Metadata Internal','')
df = pd.read_csv(io.StringIO(csvString), sep= ',')
df_2 = df[['Metadata ID','Metadata Title']]
sparkdf = pandas_to_spark(df_2)
sparkdf.show()
csv_report_path = wasbs_path + 'UUID_List.csv' 
sparkdf.write.csv(csv_report_path, mode = 'overwrite', header = 'true')

代码的输出为我提供了一个 csv 文件夹,文件夹内是 csv 文件。问题是如果我要下载csv,我只能一块一块地下载。

如何存储 csv 文件而不让它们分成几部分?

out put of the code Inside folder, there are csv pieces

您可以使用 coalesce(1) 将输出折叠到 pyspark 中的单个文件 注意:示例针对的是 ADLS 而不是 Blob 存储,但原理应该是相同的。

# Output using Spark
output_container_path = "abfss://{your_container_name}@{your_account_name}.dfs.core.windows.net"
full_output_name = "{}/{}/{}".format(output_container_path,output_folder_name,output_blob_name)

(queryData
 .coalesce(1)
 .write
 .mode("overwrite")
 .option("header", "true")
 .format("com.databricks.spark.csv")
 .save(full_output_name))

缺点是你会得到 1 个文件,但你无法控制名称,所以它会有一个非常无用的名称,如 QID1599336_20210414_184911_0.txt.