介紹DataFrames——Python
本文提供了一些常見的編碼示例PySpark DataFrame api使用Python。
DataFrame是一個二維標簽數據結構可能不同類型的列。你能想到的DataFrame像電子表格,SQL表或詞典係列對象。的更多信息和示例,請參見快速入門在Apache火花文檔網站上。
創建DataFrames
下麵的例子使用了行類火花SQL創建幾個DataFrames。的內容幾這些DataFrames然後打印出來。
#從模塊導入pyspark類行sql從pyspark.sql進口*#創建示例數據-部門和員工#創建部門department1=行(id=“123456”,的名字=“計算機科學”)department2=行(id=“789012”,的名字=“機械工程”)department3=行(id=“345678”,的名字=“戲劇和戲劇”)department4=行(id=“901234”,的名字=“室內娛樂”)#創建員工員工=行(“firstName”,“姓”,“電子郵件”,“工資”)employee1=員工(“邁克爾”,“時常要”,“no-reply@berkeley.edu”,100000年)employee2=員工(“xiangrui”,“孟”,“no-reply@stanford.edu”,120000年)employee3=員工(馬泰的,沒有一個,“no-reply@waterloo.edu”,140000年)employee4=員工(沒有一個,“溫德爾”,“no-reply@berkeley.edu”,160000年)employee5=員工(“邁克爾”,“傑克遜”,“no-reply@neverla.nd”,80000年)#創建DepartmentWithEmployees實例從部門和員工departmentWithEmployees1=行(部門=department1,員工=(employee1,employee2])departmentWithEmployees2=行(部門=department2,員工=(employee3,employee4])departmentWithEmployees3=行(部門=department3,員工=(employee5,employee4])departmentWithEmployees4=行(部門=department4,員工=(employee2,employee3])打印(department1)打印(employee2)打印(departmentWithEmployees1。員工(0]。電子郵件)
輸出:
行(id = ' 123456 ', name =“計算機科學”)行(firstName = xiangrui, lastName =“孟”,郵件= ' no-reply@stanford.edu ',工資= 120000)no-reply@berkeley.edu
看到DataFrame創造在PySpark文檔。
從列表中創建DataFrames的行
下麵的例子使用了createDataFrame的方法SparkSession(這是Databricks-provided所代表的火花
變量)來創建一個DataFrame來自前麵的示例列表的行。
departmentsWithEmployeesSeq1=(departmentWithEmployees1,departmentWithEmployees2]df1=火花。createDataFrame(departmentsWithEmployeesSeq1)df1。顯示(截斷=假)departmentsWithEmployeesSeq2=(departmentWithEmployees3,departmentWithEmployees4]df2=火花。createDataFrame(departmentsWithEmployeesSeq2)df2。顯示(截斷=假)
輸出:
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | + + | |部門員工- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + |計算機科學{123456}|[{邁克爾,時常要,no-reply@berkeley.edu, 100000}, {xiangrui,孟,no-reply@stanford.edu, 120000}] | |{789012,機械工程}|[{馬泰,null, no-reply@waterloo.edu, 140000年},{null,溫德爾,no-reply@berkeley.edu, 160000}] | + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | + + | |部門員工- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + |{345678、戲劇和戲劇}|[{邁克爾,傑克遜,no-reply@neverla。nd 80000}, {null,溫德爾,no-reply@berkeley.edu, 160000}] | |{901234年,室內娛樂}| [{xiangrui,孟,no-reply@stanford.edu, 120000年},{馬泰,null, no-reply@waterloo.edu, 140000年}]| + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
使用DataFrames
聯盟兩個DataFrames
下麵的例子使用了聯盟方法結合指定的行成一個新的DataFrame DataFrame前麵的例子。
unionDF=df1。聯盟(df2)unionDF。顯示(截斷=假)
輸出:
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | + + | |部門員工- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + |計算機科學{123456}|[{邁克爾,時常要,no-reply@berkeley.edu, 100000}, {xiangrui,孟,no-reply@stanford.edu, 120000}] | |{789012,機械工程}|[{馬泰,null, no-reply@waterloo.edu, 140000年},{null,溫德爾,no-reply@berkeley.edu, 160000}] | |{345678、戲劇和戲劇}|[{邁克爾,傑克遜,no-reply@neverla。nd 80000}, {null,溫德爾,no-reply@berkeley.edu, 160000}] | |{901234年,室內娛樂}| [{xiangrui,孟,no-reply@stanford.edu, 120000年},{馬泰,null, no-reply@waterloo.edu, 140000年}]| + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
寫聯合DataFrame鋪文件
下麵的例子使用了rm命令(dbutils.fs.rm)的方法文件係統實用程序(dbutils.fs)在磚公用事業刪除指定的拚花文件,如果它存在。的寫然後使用方法拚花方法產生的DataFrameWriter寫DataFrame從前麵的示例指定位置的磚鋪格式的工作區。
#刪除文件是否存在dbutils。fs。rm(“/ tmp / databricks-df-example.parquet”,真正的)unionDF。寫。格式(“鋪”)。保存(“/ tmp / databricks-df-example.parquet”)
讀DataFrame鑲花的文件
下麵的例子使用了讀方法使用拚花方法產生的DataFrameReader在指定位置讀取鋪文件到一個DataFrame然後顯示DataFrame的內容。
parquetDF=火花。讀。格式(“鋪”)。負載(“/ tmp / databricks-df-example.parquet”)parquetDF。顯示(截斷=假)
輸出:
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | + + | |部門員工- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + |{789012,機械工程}|[{馬泰,null, no-reply@waterloo.edu, 140000年},{null,溫德爾,no-reply@berkeley.edu, 160000}] | |{901234年,室內娛樂}| [{xiangrui,孟,no-reply@stanford.edu, 120000年},{馬泰,null, no-reply@waterloo.edu, 140000年}]| |{345678、戲劇和戲劇}|[{邁克爾,傑克遜,no-reply@neverla。nd 80000}, {null,溫德爾,no-reply@berkeley.edu, 160000}] | |計算機科學{123456}|[{邁克爾,時常要,no-reply@berkeley.edu, 100000}, {xiangrui,孟,no-reply@stanford.edu, 120000}] | + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
爆炸員工列
下麵的例子使用了選擇方法前DataFrame項目到一個新的DataFrame一組表達式。在這種情況下,爆炸為每個函數返回一個新行員工
物品。的別名方法使用e
速記的列。的selectExpr方法新DataFrame項目一組新DataFrame SQL表達式。
從pyspark.sql.functions進口爆炸explodeDF=unionDF。選擇(爆炸(“員工”)。別名(“e”))flattenDF=explodeDF。selectExpr(“e.firstName”,“e.lastName”,“e.email”,“e.salary”)flattenDF。顯示(截斷=假)
輸出:
+ - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - + | firstName | lastName工資郵件| | | + - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - + + michael | | armbrust no-reply@berkeley.edu | | 100000 | | xiangrui no-reply@stanford.edu孟| | | 120000 | |馬泰no-reply@waterloo.edu零| | | 140000 | |零|溫德爾no-reply@berkeley.edu | | 160000 | |邁克爾·傑克遜| | no-reply@neverla。nd | 80000 | |零|溫德爾no-reply@berkeley.edu | | 160000 | | xiangrui no-reply@stanford.edu孟| | | 120000 | |馬泰零no-reply@waterloo.edu | 140000 | + | | - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
使用filter ()
返回一個謂詞相匹配的行
下麵的例子使用了過濾器方法前DataFrame隻顯示這些行firstName
字段的值是xiangrui
。然後它使用排序方法對結果進行排序的值的行”姓
字段。
filterDF=flattenDF。過濾器(flattenDF。firstName= =“xiangrui”)。排序(flattenDF。姓)filterDF。顯示(截斷=假)
輸出:
+ - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - + | firstName | lastName工資郵件| | | + - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - + + | xiangrui no-reply@stanford.edu孟| | | 120000 | | xiangrui孟no-reply@stanford.edu | 120000 | + | | - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
此示例類似於上一個,除了它隻顯示這些行firstName
字段的值是xiangrui
或邁克爾
。
從pyspark.sql.functions進口上校,asc#使用“|”而不是”或“filterDF=flattenDF。過濾器((上校(“firstName”)= =“xiangrui”)|(上校(“firstName”)= =“邁克爾”))。排序(asc(“姓”))filterDF。顯示(截斷=假)
輸出:
+ - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - + | firstName | lastName工資郵件| | | + - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - + + michael | | armbrust no-reply@berkeley.edu | | 100000 | |邁克爾·傑克遜| | no-reply@neverla。no-reply@stanford.edu孟nd | 80000 | | xiangrui | | | 120000 | | xiangrui孟no-reply@stanford.edu | 120000 | + | | - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
的在()
子句相當於filter ()
這個例子相當於前麵的示例中,除了它使用在哪裏方法,而不是過濾器方法。
whereDF=flattenDF。在哪裏((上校(“firstName”)= =“xiangrui”)|(上校(“firstName”)= =“邁克爾”))。排序(asc(“姓”))whereDF。顯示(截斷=假)
輸出:
+ - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - + | firstName | lastName工資郵件| | | + - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - + + michael | | armbrust no-reply@berkeley.edu | | 100000 | |邁克爾·傑克遜| | no-reply@neverla。no-reply@stanford.edu孟nd | 80000 | | xiangrui | | | 120000 | | xiangrui孟no-reply@stanford.edu | 120000 | + | | - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
取代零
值和- - -
使用DataFrame Na函數
下麵的例子使用了fillna前麵的方法flattenDF
DataFrame代替所有零
值的字符- - -
。
nonNullDF=flattenDF。fillna(”——“)nonNullDF。顯示(截斷=假)
之前:
+ - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - + | firstName | lastName工資郵件| | | + - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - + + michael | | armbrust no-reply@berkeley.edu | | 100000 | | xiangrui no-reply@stanford.edu孟| | | 120000 | |馬泰no-reply@waterloo.edu零| | | 140000 | |零|溫德爾no-reply@berkeley.edu | | 160000 | |邁克爾·傑克遜| | no-reply@neverla。nd | 80000 | |零|溫德爾no-reply@berkeley.edu | | 160000 | | xiangrui no-reply@stanford.edu孟| | | 120000 | |馬泰零no-reply@waterloo.edu | 140000 | + | | - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
後:
+ - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - + | firstName | lastName工資郵件| | | + - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - + + michael | | armbrust no-reply@berkeley.edu | | 100000 | | xiangrui no-reply@stanford.edu孟| | | 120000 | |馬泰no-reply@waterloo.edu | - - - | | 140000 | | - - - |溫德爾no-reply@berkeley.edu | | 160000 | |邁克爾·傑克遜| | no-reply@neverla。nd | 80000 | | - - - |溫德爾no-reply@berkeley.edu | | 160000 | | xiangrui no-reply@stanford.edu孟| | | 120000 | |馬泰no-reply@waterloo.edu | 140000 | + | - - - | - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
隻檢索行與失蹤firstName
或姓
下麵的例子使用了過濾器前麵的方法flattenDF
DataFrame隨isNull的方法列的類來顯示所有行firstName
或姓
現場有一個零
價值。
filterNonNullDF=flattenDF。過濾器(上校(“firstName”)。isNull()|上校(“姓”)。isNull())。排序(“電子郵件”)dfilterNonNullDF。顯示(截斷=假)
輸出:
+ - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - + | firstName | lastName工資郵件| | | + - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - + +零| |溫德爾no-reply@berkeley.edu | | 160000 | |零|溫德爾no-reply@berkeley.edu | | 160000 | |馬泰no-reply@waterloo.edu零| | | 140000 | |馬泰零no-reply@waterloo.edu | 140000 | + | | - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
示例聚合使用gg ()
和countDistinct ()
下麵的例子使用了選擇,groupBy,gg以前的方法nonNullDF
DataFrame隻選擇行”firstName
和姓
領域,集團的結果firstName
字段的值,然後再顯示不同的數量姓
每個名字的字段值。對於每個名字,發現隻有一個不同的姓,除了邁克爾
,兩個邁克爾時常要
和邁克爾傑克遜
。
從pyspark.sql.functions進口countDistinctcountDistinctDF=nonNullDF。選擇(“firstName”,“姓”)\。groupBy(“firstName”)\。gg(countDistinct(“姓”)。別名(“distinct_last_names”))countDistinctDF。顯示()
輸出:
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | firstName | distinct_last_names | + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +零| | 1 | | xiangrui | 1 | |馬泰| 0 | |邁克爾| 2 | + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
比較DataFrame和SQL查詢物理計劃
下麵的例子使用了解釋前麵的示例的方法DataFrame打印結果的物理計劃用於調試目的。
提示
他們應該是相同的。
countDistinctDF。解釋()
下麵的例子使用了createOrReplaceTempView前麵的示例的方法DataFrame DataFrame創建一個本地臨時視圖。這個臨時視圖存在,直到相關引發會話超出範圍。這個例子然後使用會話的火花sql這個臨時視圖上運行一個查詢的方法。物理然後顯示該查詢計劃。的結果解釋
電話應該與前麵的相同解釋
調用。
#注冊DataFrame作為臨時的視野,使我們可以通過使用SQL查詢。nonNullDF。createOrReplaceTempView(“databricks_df_example”)#執行相同的查詢作為前DataFrame然後顯示其物理計劃。countDistinctDF_sql=火花。sql(“‘選擇firstName, count(不同的lastName) distinct_last_names從databricks_df_example集團的名字“‘)countDistinctDF_sql。解釋()
總結所有的薪水
下麵的例子使用了gg前麵的方法nonNullDF
DataFrame顯示所有行薪水的總和。
salarySumDF=nonNullDF。gg({“工資”:“和”})salarySumDF。顯示()
輸出:
+ - - - - - - - - - - - - +(工資)| + |和| 1020000 | - - - - - - - - - - - - + + - - - - - - - - - - - - +
這個例子顯示的基礎數據類型工資
前DataFrame字段,這是一個長整型數字
。
匹配=“工資”為關鍵,價值在nonNullDF。dtypes:如果關鍵= =匹配:打印(f“數據類型”{匹配}“是”{價值}’。”)
輸出:
數據類型的‘工資’是‘bigint’。
打印工資的彙總統計
下麵的例子使用了描述前麵的方法nonNullDF
DataFrame顯示基本的統計數據工資
字段。
nonNullDF。描述(“工資”)。顯示()
輸出:
+ - - - - - - - - - - - - - - - - - - - - - - - - - | + |總結工資| + - - - - - - - - - - - - - - - - - - - - - - - - - | + |計數8 | |是| 127500.0 | | stddev | 28157.719063467175 | | 80000分鍾| | |馬克斯| 160000 | + + - - - - - - - - - - - - - - - - - - - - - - - - - +
一個例子使用熊貓和Matplotlib集成
下麵的例子使用了熊貓和Matplotlib庫來顯示前麵nonNullDF
DataFrame的信息圖形化。下麵的例子使用了toPandas方法DataFrame輸出DataFrame內容的熊貓DataFrame,它使用clf和情節的方法matplotlib.pyplot在Matplotlib清理繪製表麵,然後創建實際的陰謀。
進口熊貓作為pd進口matplotlib.pyplot作為pltplt。clf()pdDF=nonNullDF。toPandas()pdDF。情節(x=“firstName”,y=“工資”,類=“酒吧”,腐爛=45)顯示()
輸出:
清除:清除鋪文件
下麵的例子使用了rm命令(dbutils.fs.rm)的方法文件係統實用程序(dbutils.fs)在磚公用事業刪除的鑲花文件最初對本文的開頭寫的。
dbutils。fs。rm(“/ tmp / databricks-df-example.parquet”,真正的)
DataFrame常見問題
這個FAQ地址常見用例和示例使用使用可用的api。更詳細的API的描述,請參閱PySpark文檔。
我怎樣才能獲得更好的性能與DataFrame udf嗎?
如果存在於內置函數的功能,使用這些會表現得更好。使用例子。也看到PySpark功能API參考。使用內置函數和withColumn ()
API添加新列。您還可以使用withColumnRenamed ()
後替換現有列變換。
從pyspark.sql進口功能作為F從pyspark.sql.types進口*# DataFrame數據集構建一個例子。dbutils。fs。rm(“/ tmp / dataframe_sample.csv”,真正的)dbutils。fs。把(“/ tmp / dataframe_sample.csv”,”““id | end_date | start_date |位置1 | 2015-10-14就是| 2015-09-14就是| CA-SF2 | 2015-10-15 01:00:20 | 2015-08-14就是| CA-SD3 | 2015-10-16 02:30:00 | 2015-01-14就是| NY-NY4 | 2015-10-17 03:00:20 | 2015-02-14就是| NY-NY5 | 2015-10-18 04:30:00 | 2014-04-14就是| CA-SD”“”,真正的)df=火花。讀。格式(“csv”)。選項(頭=“真正的”,分隔符=“|”)。負載(“/ tmp / dataframe_sample.csv”)df。printSchema()
#而不是注冊一個UDF調用內建函數的列上執行操作。#這將提供一個性能改進的內置命令編譯和運行平台的JVM。Beplay体育安卓版本#轉換為日期類型df=df。withColumn(“日期”,F。to_date(df。end_date))#解析日期df=df。withColumn(“date_only”,F。regexp_replace(df。end_date,”(\ d +) [:] (\ d +) [:] (\ d +) *美元。”,”))#分割字符串和索引字段df=df。withColumn(“城市”,F。分裂(df。位置,“- - -”)[1])#執行日期比較功能df=df。withColumn(“date_diff”,F。datediff(F。to_date(df。end_date),F。to_date(df。start_date)))
df。createOrReplaceTempView(“sample_df”)顯示(sql(“從sample_df select *”))
我想把DataFrame JSON字符串返回卡夫卡。
有一個潛在的toJSON ()
函數返回一個JSON字符串使用抽樣列名和模式產生的JSON記錄。
rdd_json=df。toJSON()rdd_json。取(2)
我的UDF將參數包括列操作。我怎麼通過這個參數嗎?
有一個函數可以調用點燃()
創建一個常數列。
從pyspark.sql進口功能作為Fadd_n=udf(λx,y:x+y,IntegerType())#我們注冊一個UDF DataFrame添加一個列,我們把id列整數類型。df=df。withColumn(“id_offset”,add_n(F。點燃(1000年),df。id。投(IntegerType())))
顯示(df)
#任何常量使用UDF將自動通過工人N=90年last_n_days=udf(λx:x<N,BooleanType())df_filtered=df。過濾器(last_n_days(df。date_diff))顯示(df_filtered)
我有一個表在蜂房裏metastore我想DataFrame訪問表。這是最好的方式來定義什麼?
有多種方法定義一個DataFrame從注冊表。調用表(表)
或選擇使用一個SQL查詢和篩選特定列:
#都返回DataFrame類型df_1=表(“sample_df”)df_2=火花。sql(“從sample_df select *”)
我想清除所有緩存的表在當前集群。
有一個可用的API在全球層麵或每桌。
火花。目錄。clearCache()火花。目錄。cacheTable(“sample_df”)火花。目錄。uncacheTable(“sample_df”)
我想計算總量列上。做這個最好的方法是什麼?
的gg (* exprs)
方法接受一個列名列表和表達式的類型聚合你想計算。看到pyspark.sql.DataFrame.agg。您可以使用內置函數在每一列的表達式。
#提供最小,計數,avg和groupBy location列。結果還agg_df=df。groupBy(“位置”)。gg(F。最小值(“id”),F。數(“id”),F。avg(“date_diff”))顯示(agg_df)
我想寫出DataFrames拚花,但想分區特定列。
您可以使用以下api來完成這項工作。確保代碼沒有創建大量的分區列的數據集,否則元數據的開銷可能會導致顯著的緩慢波動。如果有一個SQL表這個目錄,您需要調用刷新表<表名稱>
前更新元數據查詢。
df=df。withColumn(“end_month”,F。月(“end_date”))df=df。withColumn(“end_year”,F。一年(“end_date”))df。寫。partitionBy(“end_year”,“end_month”)。格式(“鋪”)。保存(“/ tmp / sample_table”)顯示(dbutils。fs。ls(“/ tmp / sample_table”))
如何妥善處理情況我想過濾空數據?
您可以使用filter ()
並提供類似的語法就像跟一個SQL查詢。
null_item_schema=StructType([StructField(“col1”,StringType(),真正的),StructField(“col2”,IntegerType(),真正的)))null_df=火花。createDataFrame(((“測試”,1),(沒有一個,2)),null_item_schema)顯示(null_df。過濾器(“col1 NOT NULL”))
我怎麼推斷模式使用CSV
或spark-avro
庫嗎?
有一個inferSchema
選擇標記。提供一個頭確保適當的列命名。
adult_df=火花。讀。\格式(“com.spark.csv”)。\選項(“頭”,“假”)。\選項(“inferSchema”,“真正的”)。負載(“dbfs: / databricks-datasets /成人/ adult.data”)adult_df。printSchema()
你有一個分隔的字符串數據集,你想把他們的數據類型。你將如何做到這一點?
使用抽樣api來過濾出畸形行和映射到適當的類型的值。我們定義一個函數,過濾器使用正則表達式。