PYSPARK:是否有同等方法来pandas info()



pyspark中是否有同等方法?

我正在尝试获得有关PySpark中数据框架的基本统计信息,例如:列和行的数量null的数量dataframe的尺寸

info((方法在熊猫中提供所有这些统计信息。

也有摘要方法可以获取行号和其他一些描述统计信息。它类似于已经提到的描述方法。

来自Pyspark手册:

df.summary().show()
+-------+------------------+-----+
|summary|               age| name|
+-------+------------------+-----+
|  count|                 2|    2|
|   mean|               3.5| null|
| stddev|2.1213203435596424| null|
|    min|                 2|Alice|
|    25%|                 2| null|
|    50%|                 2| null|
|    75%|                 5| null|
|    max|                 5|  Bob|
+-------+------------------+-----+
or
df.select("age", "name").summary("count").show()
+-------+---+----+
|summary|age|name|
+-------+---+----+
|  count|  2|   2|
+-------+---+----+

要找出有关数据框架的类型信息,您可以尝试df.schema

spark.read.csv('matchCount.csv',header=True).printSchema()
StructType(List(StructField(categ,StringType,true),StructField(minv,StringType,true),StructField(maxv,StringType,true),StructField(counts,StringType,true),StructField(cutoff,StringType,true)))

有关摘要统计信息,您还可以查看文档中的描述方法。

我找不到一个好的答案,所以我使用略微作弊

dataFrame.toPandas().info()

检查此答案以获取null而不是零值的计数。

from pyspark.sql.functions import isnan, when, count, col
import numpy as np
df = spark.createDataFrame(
    [(1, 1, None), (1, 2, float(5)), (1, 3, np.nan), (1, 4, None), (1, 5, float(10)), (1, 6, float('nan')), (1, 6, float('nan'))],
    ('session', "timestamp1", "id2"))
df.show()
# +-------+----------+----+
# |session|timestamp1| id2|
# +-------+----------+----+
# |      1|         1|null|
# |      1|         2| 5.0|
# |      1|         3| NaN|
# |      2|         4|null|
# |      1|         5|10.0|
# |      1|         6| NaN|
# |      1|         6| NaN|
# +-------+----------+----+
df.select([count(when(isnan(c), c)).alias(c) for c in df.columns]).show()
# +-------+----------+---+
# |session|timestamp1|id2|
# +-------+----------+---+
# |      0|         0|  3|
# +-------+----------+---+
df.select([count(when(isnan(c) | col(c).isNull(), c)).alias(c) for c in df.columns]).show()
# +-------+----------+---+
# |session|timestamp1|id2|
# +-------+----------+---+
# |      0|         0|  5|
# +-------+----------+---+
df.describe().show()
# +-------+-------+------------------+---+
# |summary|session|        timestamp1|id2|
# +-------+-------+------------------+---+
# |  count|      7|                 7|  5|
# |   mean|    1.0| 3.857142857142857|NaN|
# | stddev|    0.0|1.9518001458970662|NaN|
# |    min|      1|                 1|5.0|
# |    max|      1|                 6|NaN|
# +-------+-------+------------------+---

我知道的是pandas.DataFrame.info()的等效。 PrintSchema很有用,toPandas.info()适用于小型数据框架,但是当我使用pandas.DataFrame.info()时,我经常查看null值。

我写了一个模拟pandas.dataframe.info((

的pyspark函数
from collections import Counter
def spark_info(df, abbreviate_columns=True, include_nested_types=False, count=None):
    """Similar to Pandas.DataFrame.info which produces output like:
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 201100 entries, 0 to 201099
    Columns: 151 entries, first_col to last_col
    dtypes: float64(20), int64(6), object(50)
    memory usage: 231.7+ MB
    """
    classinfo = "<class 'pyspark.sql.dataframe.DataFrame'>"
    _cnt = count if count else df.count()
    numrows = f"Total Rows: {str(_cnt)}"
    _cols = (
        ', to '.join([
            df.columns[0], df.columns[-1]]) 
        if abbreviate_columns 
        else ', '.join(df.columns))
    columns = f"{len(df.columns)} entries: {_cols}"
    _typs = [
        col.dataType 
        for col in df.schema 
        if include_nested_types or (
            'ArrayType' not in str(col.dataType) and 
            'StructType' not in str(col.dataType) and
            'MapType' not in str(col.dataType))
    ]
    dtypes = ', '.join(
        f"{str(typ)}({cnt})" 
        for typ, cnt in Counter(_typs).items())
    mem = f'memory usage: ? bytes'
    return 'n'.join([classinfo, numrows, columns, dtypes, mem])

我不确定估计Pyspark DataFrame的大小。这取决于完整的火花执行计划和配置,但也许可以尝试此答案。

请注意,并非所有dtype摘要都包含在内,默认情况下不包括嵌套类型。还计算了df.count(),这可能需要一段时间,除非您先对其进行计算并传递。

建议用法:

>>> df = spark.createDataFrame(((1, 'a', 2),(2,'b',3)), ['id', 'letter', 'num'])
>>> print(spark_info(df, count=2))
<class 'pyspark.sql.dataframe.DataFrame'>
Total Rows: 2
3 entries: id, to num
LongType(2), StringType(1)
memory usage: ? bytes

最新更新