Spark记录(二):DataFrame及其方法

DF常用方法与参数总结

Posted by ZA on August 2, 2024

DataFrame

DataFrame方法:

在日常工作中的常用方法总结如下:

  • .read.csv(path, *opt)
    • 用于读取csv文件,必须声明路径;
    • 此外还包含多个可选项,例如 指定分隔符sep=‘/t’ 为制表符Tab
  • .withColumn(colName, col)
    • 用于添加一个新列,需要声明新列的命名和内容
    • CSV不包含列名信息,Spark读取后会自动分配为’_c0’, ‘_c1’…;
    • 因此可以通过(‘ID’, ‘_c0’)实现一个命名操作(.withColumn(“cuid”, F.col(“_c0”)))
  • .filter( ‘*sql_String’ )
    • 用于过滤数据,输入一个列或者SQL语句字符串
  • .selectExpr( ‘colName’ or ’sql_String’)
    • 创建一个新的DataFrame,内容基于输入的sql表达式;
    • .select()从用于从现有DataFrame中筛选出特定的列,并形成一个新的DataFrame;
    • 而.selectExpr()就是一个特殊的.select,它可以接受SQL语句;
    • 常用‘Signal as ColName’,将一个命名为ColName,内容为Signal的列添加到新的DF中。
  • .col( ‘*colname’ )
    • 用于引用DataFrame中的列
  • .dropDuplicates( subset=None )
    • 返回一个新DataFrame,其中删除了重复行,可以通过subset选择仅考虑某些列。
  • df1.join(df2, ‘ *colname’, how)
    • 将两个DF基于键 ‘ *colname’ 做连接,方式遵循how声明的声明,包括
      • “inner” 代表内连接,只保留两个数据集中键值匹配的数据;
      • “cross” 代表交叉连接,生成两个数据集的笛卡尔积;
      • “outer” 或 “full” 代表全连接,保留两个数据集中的所有数据,并用空值填充缺失的部分;
      • “left” 代表左连接,保留左侧数据集的所有数据,右侧数据集中未匹配的部分用空值填充;
      • “right” 代表右连接,与左连接相反;
      • “semi” 或 “leftsemi” 代表左半连接,只保留左侧数据集中能在右侧数据集找到匹配的数据;
      • “anti” 或 “leftanti” 代表左反连接,只保留左侧数据集中不能在右侧数据集找到匹配的数据。
  • F.expr()
    • 用于执行SQL表达式。你可以在这个函数中使用任何有效的SQL表达式。
  • .count( ‘ *colname’ ) & .countDistinct( ‘ *colname’ )
    • count用于统计总数,会计算指定列下各个非空值的数量
    • countDistinct用于统计不同值的数量,会计算指定列下不同非空值的数目
    • 因此这段代码中,”fansou_pv” 表示泛搜总访问量,而 “fansou_uv” 表示访客数。
      • F.count(“cuid”).alias(“fansou_pv”), F.countDistinct(“cuid”).alias(“fansou_uv”)
  • .groupBy( ‘ *colname’ )
    • 按指定列名进行分组,这个操作不会改变DataFrame的物理存储和显示结果,不发生重新排序。而是创建一个逻辑分组,使得具有相同指定列值的行会被聚集到一起,便于后续的聚合函数在这些分组上进行操作;
    • 它使得聚合的范围被限制在了一个个的cuid内,如果不进行groupBy,.agg()将会在整个DataFrame上操作,并统计整个数据中的cuid非空值个数。
  • .agg()
    • 生成一个新的DataFrame,它包含了原始DataFrame经过聚合函数处理后的结果。
    • .agg(F.count(“cuid”).alias(“click_count”))为例,新的DF将只包含两个列:cuidclick_count,记录了每个cuid在原fansou_click_data中的出现次数