讀取excel PySpark讀取Excel

2021-10-14 22:10:38 字數 3483 閱讀 4144

日常工作中,客戶通過excel提供資料是一種很常見的方式,既然碰到了就得解決。

我常用的辦法就是pandas讀取,並儲存為parquet,

# 如果只讀取乙個sheet,import pandas as pddf=pd.read_excel("excel1.xlsx")df.to_parquet("excel_etl/excel1.parquet")
# 如果乙個excel有多個sheetimport pandas as pdxl=pd.excelfile("多sheetexcel.xlsx")sheets=xl.sheet_namesfor sheet in sheets:    print(sheet)    df=xl.parse(sheet)    df.to_parquet(f"excel_etl/.parquet")
如果所有sheets格式一致,pyspark可以輕鬆一次讀取全部資料,

from pyspark.sql import sparksessionspark = sparksession.builder\.master("local[*]")\.getorcreate()
#只需要讀取整個目錄即可df=spark.read.parquet("excel_etl")#也可以通過正規表示式來選擇性讀取自己想讀取的parquet# df=spark.read.parquet("excel_etl/*.parquet")
另外也可以使用spark excel外掛程式(均基於poi)來讀取,這裡介紹兩款,

from pyspark import sparkconfconf=sparkconf()\.set("spark.jars.packages","com.crealytics:spark-excel_2.11:0.11.1")\.set("spark.sql.shuffle.partitions", "4")\.set("spark.sql.execution.arrow.enabled", "true")\.set("spark.driver.maxresultsize","6g")\.set('spark.driver.memory','6g')\.set('spark.executor.memory','6g')from pyspark.sql import sparksessionspark = sparksession.builder\.config(conf=conf)\.master("local[*]")\.getorcreate()xlsx="online retail.xlsx"df = spark.read\    .format("com.crealytics.spark.excel")\    .option("useheader", "true")\    .option("treatemptyvaluesasnulls", "false")\    .option("inferschema", "true") \    .option("timestampformat", "mm-dd-yyyy hh:mm:ss")\    .option("maxrowsinmemory", 20)\    .option("excerptsize", 10)\    .load(xlsx)    df.printschema()
root

|-- invoiceno: double (nullable = true)

|-- stockcode: string (nullable = true)

|-- description: string (nullable = true)

|-- quantity: double (nullable = true)

|-- invoicedate: timestamp (nullable = true)

|-- unitprice: double (nullable = true)

|-- customerid: double (nullable = true)

|-- country: string (nullable = true)

# 讀入的字段型別有誤,需要做適當調整import pyspark.sql.functions as fdf=df.withcolumn("invoiceno",f.col('invoiceno').cast("string"))df.write.parquet("online retail",mode="overwrite")
# excel行數太多,測試失敗,行數較少的時候沒有問題# 另外非常耗資源,沒有在集群上做過測試from pyspark import sparkconfconf=sparkconf()\.set("spark.jars.packages","com.github.zuinnote:spark-hadoopoffice-ds_2.11:1.3.0")\.set("spark.sql.shuffle.partitions", "4")\.set("spark.sql.execution.arrow.enabled", "true")\.set("spark.driver.maxresultsize","6g")\.set("spark.sql.execution.arrow.enabled", "true")\.set('spark.driver.memory','6g').set('spark.executor.memory','6g')from pyspark.sql import sparksessionspark = sparksession.builder\.config(conf=conf)\.master("local[*]")\.getorcreate()df=spark.read.format('org.zuinnote.spark.office.excel')\.option("read.locale.bcp47","zh-hans")\.option("read.spark.******mode",true)\.option("read.header.read",true)\.load("online retail.xlsx")df.printschema()df.write.parquet("online retail",mode="overwrite")
參考資源,

歷史文章:

17個新手常見python執行時錯誤

pyspark 之批量執行sql語句

python基礎入門教程《python入門經典》

開源bi metabase與spark sql的碰撞

為了更好的服務資料圈內同學,我們需要更多的志願者,主要協助推廣**,尋找更多更好的內容,有興趣的同學可以聯絡l23683716,加志願者群。

求職招聘,技術交流:

innodb 鎖定讀取(當前讀)

當事務a用常規的select語句查詢資料後想做更新或插入操作,但常規的select語句不能對這些資料提供很好的保護。其他的事務可以在a查詢之後對查詢結果進行更新或刪除的操作。鎖定讀取語句 innodb額外的提供了兩種鎖定讀取保證資料的安全 1 在讀取的任何行上設定共享模式鎖定。select.lock...

python讀取檔案,讀檔案的前幾行

python中怎麼讀取前幾行資料呢 有2種方法 1.這種比較簡單 n int input f open test.txt r for i in range n print f.readline strip 2.這種就比較麻煩了,我覺得python最大的優點就是內建函式比較多 所以還是比較推薦第一種呀...

golang檔案讀取 按指定BUFF大小讀取方式

a.txt檔案內容 abcdefghi hello golang package main import fmt os io func main defer file.close stat,err file.stat if err nil var size stat.size fmt.println...