#python #azure #csv #azure-synapse
Вопрос:
Я использую Azure Synapse Notebook для хранения фрейма данных spark в виде csv-файла в хранилище больших двоичных объектов со следующим кодом:
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-файл, не разбивая его на части?
Ответ №1:
Вы можете свернуть выходные данные в один файл в pyspark, используя coalesce(1) ПРИМЕЧАНИЕ.Пример предназначен для ADL вместо хранилища больших двоичных объектов, но принцип должен быть тем же.
# 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.