簡體   English   中英

僅使用開放源代碼工具從Python查找和計算SAS7BDAT文件中的記錄總數

[英]Seek and compute total number of records in SAS7BDAT file from Python exclusively with open source tools

我有一些sas7dat文件,其中包含數億行,並且在100GB-1000GB附近。 我希望能夠高效地執行以下操作:

  1. 計算文件中的記錄數。
  2. 尋求記錄n

有什么方法可以通過pandas.read_sas接口執行此操作? 我想避免使用SAS本身。

讀入文件並使用.shape確定行數

import pandas as pd

df = pd.read_sas('filename.sas7bdat')
df.shape[0]

無法有效讀取文件並使用pandas做您想做的事情。 這是一個出路-

使用chunksize參數可以發揮您的優勢-

CHUNKSIZE = 1e6
rows = 0
for df in pd.read_sas('path/to/sas/filename.sas7bdat', chunksize=CHUNKSIZE, iterator=True):
    rows += df.shape[0]
    # whatever else you want

說明

這一次讀取一百萬行(改變chunksize取決於你有多少RAM負擔)和迭代計算你想要什么。 另外,您可以使用它來執行其他與df相關的操作,只要您不斷積累它們即可。

警告

在嘗試讀取約100 GB的商品硬件上,效率仍然很低。

我找到了答案! 但是答案涉及不使用熊貓,這就是我更改標題的原因。

Apache Spark有一個開源的SAS7BDAT實現 (它是用Scala編寫的)。 “這種格式在輸入未壓縮時是可拆分的,因此可以為大型SAS文件實現高度的並行性。...由於采用了可拆分的SasInputFormat,我們能夠使用2000將200GB(15億行).sas7bdat文件轉換為.csv文件。不到2分鍾即可執行。”

使用此代碼,計算行數的有效方法是:

from pyspark.sql import SQLContext

sqlContext = SQLContext(sc)
df = sqlContext.read.format("com.github.saurfang.sas.spark").load("input.sas7bdat")
print("Number of rows in input.sas7bdat: {}".format(df.count()))

暫無
暫無

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

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