1  联表

  df1.join(df2,连接条件,连接方式)

  如:df1.join(df2,[df1.a==df2.a], "inner").show()

  连接方式:字符串类型, 如 "left"  , 常用的有:inner, cross, outer, full, full_outer, left, left_outer, right, right_outer

  连接条件: df1["a"] == df2["a"] 或 "a" 或 df1.a == df2.a , 如有多个条件的情况 如,[df1["a"] == df2["a"] ,df1["b"] == df2["b"] ] 或  (df.a > 1) & (df.b > 1)

  需要注意的:

  如果使用 "a" 进行连接,则会自动合并相同字段,只输入一个。如  df1.join(df2,"a","left") 只输出df1的 a字段,df2 的 a 字段是去掉了。

2 udf使用

  需添加引用

  from pyspark.sql.functions import udf
  from pyspark.sql import functions as F

  有两种方式:

  第一种

  def get_tablename(a):

    return "name"

  get_tablename_udf = F.udf(get_tablename)

  第二种

  @udf

  def get_tablename_udf (a):

    return "name"

  

  两种方式的调用是一样的

  df.withColumn("tablename", get_tablename_udf (df[a"]))

3  分组

  使用groupBy方法

  单个字段:df.groupBy("a") 或 df.groupBy(df.a)

  多个字段:df.groupBy([df.a, df.b]) 或 df.groupBy(["a", "b"])

  需要注意的:

  groupBy方法后面 一定要跟字段输出方法,如:agg()、select()等

4  查询条件

  使用 filter() 或 where() ,两者一样的。

  单条件: df.filter(df.a > 1) 或 df.filter("a > 1")

  多条件:df.filter("a > 1 and b > 0 ")  或 df.filter((df.a > 1) & (df.b ==0))

5  替换null值

  使用 fillna() 或 fill()方法

  df.fillna({"a":0, "b":""})

  df.na.fill({"a":0, "b":""})

6  排序

  使用 orderBy() 或 sort()方法

  df.orderBy(df.a.desc())

  df.orderBy(desc("age"), asc("name"))

df.orderBy(["age", "name"], ascending=[0, 1])

  df.orderBy(["age", "name"], ascending=False)

  需要注意的:

  ascending 默认为True 升序, False 降序

7  新增列

  使用 withColumn() 或 alias()方法

  df.withColumn("b",F.lit(999))

  df.withColumn("b",df.a)

  df.withColumn("b",df.a).withColumn("m","m1")

  df.agg(F.lit(ggg).alias("b"))

  df.select(F.lit(ggg).alias("b"))

  需要注意的:

  withColumn方法会覆盖df里面原有的同名的列

8  重命名列名

  使用 withColumnRenamed() 方法

  df.withColumnRenamed("a","a1").withColumnRenamed("m","m1") 

  需要注意的点:

  确定要重命名的列在df里面存在

9  创建新的DataFrame

  使用createDataFrame()方法

  spark.createDataFrame(数据集, 列集合)  例如:spark.createDataFrame([(5, "hello")], ['a', 'b'])

  需要注意的:

   数据集和列集合 个数要一致

   spark为 SparkSession 对象, 例如:spark = SparkSession.builder.master("local").appName("Word Count").config("spark.some.config.option", "some-value").getOrCreate()

10  并集

  使用union() 或 unionAll() 方法

  df.union(df1)

  需要注意的:

  这两个方法都不会主动消除重复项的,如需要,在后面跟distinct() 如:df.union(df1).distinct()

  这两个方法都是按照数据列的摆放顺序进行合并,而不是根据列名

  两个结果集的列 数量要保证一样大小

11  交集

  使用 intersect()方法

  df1.select("a").intersect(df2.select("a"))

  返回 df1和df2 中 相同的a 字段

12  差集

  使用 subtract()方法

  df1.select("a").subtract(df2.select("a"))  

  返回 df1 有,而df2 没有的 a 字段值。

  需要注意的:

    取的是df1的数据

13  判断是否NULL值

  使用isNull()方法 或 sql语句

  df.where(df["a"].isNull())

  df.where("a is null")

14  在计算条件中加入判断

  使用when() 方法

  df.select(when(df.age == 2, 1).alias("age")) 

  age列的值:当满足when条件,则输出1 ,否则,输出NULL 

  多个条件 :when((df.age == 2) & (df.name == '"name") , 1)

  

pyspark 日常整理的更多相关文章

  1. JavaScript中常用的正则表达式日常整理(全)

    //校验是否全由数字组成 ? 1 2 3 4 5 6 function isDigit(s) { var patrn=/^[0-9]{1,20}$/; if (!patrn.exec(s)) retu ...

  2. IDEA快捷键 日常整理

    F9 : debug Ctrl+” +/- ” : 当前方法展开.折叠 Ctrl+Shift+”+/-” : 全部展开.折叠 Alt+1 : 工程面板 Alt+4:控制台 Alt+7:查看本类方法 S ...

  3. js/jq基础(日常整理记录)-4-一个简单的自定义tree插件

    一.一个简单的自定义tree插件 上一篇是之前自定义的table插件,这一篇也是之前同期尝试做的一个tree插件. 话不多说,先看看长什么样子哈! 现在来看确实不好看,以后在优化吧! 数据源:ajax ...

  4. js/jq基础(日常整理记录)-3-一个自定义表格

    一.一个自定义的表格 这个js是我刚工作的时候,我们老大让我做一个功能,我觉得html自带的table功能单一,没有分页和排序功能,所有就尝试着做一下,所以这个东西就出来了.很久没写博客了,贴出来吧, ...

  5. js/jq基础(日常整理记录)-2-一个简单的js方法实现集合的非引用拷贝

    一.一个简单的js方法实现集合拷贝 做web项目的时候,少不了和js中的数组,集合等对象接触,那么你肯定会发现,在js中存在一个怪异的现象就是数组和集合的拷贝都是地址复制,并不是简单的数据的拷贝. 举 ...

  6. js/jq基础(日常整理记录)-1-纯js格式化时间

    一.纯js格式化时间 之前记录了一些,工作中发现的比较常用的使用,就记录一下. 由于很基础,就直接贴出来了,不做分析了. 改造一下Date的原型 Date.prototype.format = fun ...

  7. python面试大全

    问题一:以下的代码的输出将是什么? 说出你的答案并解释. class Parent(object): x = 1 class Child1(Parent): pass class Child2(Par ...

  8. python公司面试题集锦 python面试题大全

    问题一:以下的代码的输出将是什么? 说出你的答案并解释. class Parent(object): x = 1 class Child1(Parent): pass class Child2(Par ...

  9. oracle常用命令【转载】

    oracle常用命令 一.Oracle数据库实例.用户.目录及session会话查看: 1.ORACLE SID查看设置 查看SID.用户名 $ env|grep SID .select * from ...

随机推荐

  1. Oracle - 数字处理 - 取上取整、向下取整、保留N位小数、四舍五入、数字格式化

    用oracle sql对数字进行操作: 取上取整.向下取整.保留N位小数.四舍五入.数字格式化 取整(向下取整): select floor(5.534) from dual; select trun ...

  2. easyui高级控件

    开发模式 1. 美工(ui工程师:出一个项目模型) java工程师:将原有的html转成jsp,动态展示数据 缺点: 客户需要调节前端的展示效果 解决:由美工去重新排版,重新选色.2.前后端分离 美工 ...

  3. DRF简易了解

    Drf框架 一丶API接口 # 为了在团队内部形成共识.防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得很好的接口实现规范,而且这种规范能够让后端写的接口,用途一目了然,减少双方之间的合作成本. ...

  4. Windows下实现应用程序看门狗软件

    有时候,我们需要确保一个应用程序长期稳定地运行,但是在Windows平台上由于种种原因,几乎不可能保障一个应用的绝对可靠运行.那么,我们就需要有一个机制,在应用死机﹑异常﹑系统重启等情况下自我恢复,而 ...

  5. jvm默认的并行垃圾回收器和G1垃圾回收器性能对比

    http://www.importnew.com/13827.html 参数如下: JAVA_OPTS="-server -Xms1024m -Xmx1024m -Xss256k -XX:M ...

  6. 对cell每一行做标记

    通过数组进行标记 初始化列表的时候给一个值如 for (int i = 0; i < [self.tableData count]; i++)    {        [_allOrderBoo ...

  7. linux 修改文件打开数量限制

    1.查看打开文件数量限制 ulimit -a ulimit -n 2.临时修改 ulimit -n 2048 3.永久修改 vi /etc/security/limits.conf 追加 * soft ...

  8. visudo: /etc/sudoers is busy, try again later

    启动visudo时,报错"visudo: /etc/sudoers is busy, try again later" 解决思路:杀掉visudo进程 ps -ef|grep vi ...

  9. Java代码实现定时器

    一 import java.util.Timer; import java.util.TimerTask; public class time { public static void main(St ...

  10. F5部署SSL证书

    查找中间证书 为了保证可以兼容所有浏览器,我们必须在服务器上安装中间证书,请到 中间证书下载工具,输入您的Server.cer,然后下载中间证书,请将中间证书保存为Chain.cer. 证书文件的上传 ...