簡體   English   中英

將CSV載入PySpark中的DataFrame時出現問題

[英]Problem loading csv into DataFrame in PySpark

我正在嘗試將一堆CSV文件聚合到一個文件中,並使用AWS Glue中的ETL作業以ORC格式將其輸出到S3。 我的匯總CSV如下所示:

header1,header2,header3
foo1,foo2,foo3
bar1,bar2,bar3

我有一個稱為aggregated_csv的聚合CSV字符串表示形式,其內容為header1,header2,header3\\nfoo1,foo2,foo3\\nbar1,bar2,bar3 我讀過pyspark有一種直接的方式將CSV文件轉換為DataFrames(我需要這樣做,以便我可以利用Glue的能力輕松在ORC中輸出)。 這是我嘗試過的片段:

def f(glueContext, aggregated_csv, schema):
    with open('somefile', 'a+') as agg_file:
        agg_file.write(aggregated_csv)
        #agg_file.seek(0)
        df = glueContext.read.csv(agg_file, schema=schema, header="true")
        df.show()

我已經嘗試過,無論有沒有尋求。 當我不調用seek()時,作業將成功完成,但df.show()不會顯示標題以外的任何數據。 當我調用seek()時,出現以下異常:

pyspark.sql.utils.AnalysisException: u'Path does not exist: hdfs://ip-172-31-48-255.us-west-2.compute.internal:8020/user/root/header1,header2,header3\n;'

由於seek似乎改變了行為,並且由於我的csv中的標頭是異常字符串的一部分,因此我假設問題與我將文件傳遞給glueContext.read.csv()時文件游標的位置有關。但我不確定如何解決。 如果取消注釋seek(0)調用並添加agg_file.read()命令,則可以按預期看到文件的全部內容。 為了使我能夠成功讀取剛剛寫入spark數據幀的csv文件,我需要更改什么?

我認為您正在將錯誤的參數傳遞給csv函數。 我相信, GlueContext.read.csv()將獲得的實例DataFrameReader.csv()它的簽名將文件名作為第一個參數,而你正在傳遞是一個類似文件的對象。

def f(glueContext, aggregated_csv, schema):
    with open('somefile', 'a+') as agg_file:
        agg_file.write(aggregated_csv)
        #agg_file.seek(0)
    df = glueContext.read.csv('somefile', schema=schema, header="true")
    df.show()

但是,如果您只希望它編寫一個ORC文件,並且已經將數據讀取為aggregated_csv ,則可以直接從元組列表中創建DataFrame

df = spark.createDataFrame([('foo1','foo2','foo3'), ('bar1','bar2','bar3')], ['header1', 'header2', 'header3'])

然后,如果您需要Glue DynamicFrame使用fromDF函數

dynF = fromDF(df, glueContext, 'myFrame')

一個更重要的是:您不需要膠水來編寫ORC-完全激發它即可。 只需使用DataFrameWriter.orc()函數:

df.write.orc('s3://path')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM