spark dataframe API 整理_ZhanYunQI的博客-程序员宅基地

技术标签: spark  sql  

1,从列表中创建dataframe
   列表的每一个元素转换成Row对象,利用parallelize()函数将列表转换成RDD,toDF()函数将RDD转换成dataframe
   from pyspark.sql import Row
   l=[Row(name='jack',age=10),Row(name='lucy',age=12)]
   df=sc.parallelize(l).toDF()
   
   从RDD中创建Dataframe:rdd中的数据没有schema,利用Row创建Schema,spark再根据抽样数据确定数据类型,如果定义不了,系统会给None(有点坑)
   l=[('jack',10),('lucy',12)]
   rdd=sc.parallelize(l)
   person=Row('name','age')

   df=rdd.map(lambda r:person(*r)).toDF()


   从RDD中创建Dataframe使用类型说明

   from pyspark.sql .types import *

  schema=StructType([StructField('name',StringType(),False)

    ,StructField('age',IntegerType(),False)]

  df=sqlContext.applySchema(rdd,schema)

  这一种方式会严格检查数据类型,如果数据不符合定义格式就报错;当rdd为空的时候,仍然能够成功创建dataframe


   
2,注册临时表
    df.registerTempTable("t1") 即可,但是t1表的只在当前sqlContext下有效
    df_table=sqlContext.tables() 命令可以查询所有表报表,临时表,HIVE表
    => table_name=sqlContext.tables()
    => t1=table_name.filter(table_name.isTemporary)
3,聚合函数的使用
   可以结合agg(),pyspark.sql.function来处理
   from pyspark.sql import functions as F
   => l=[Row(name='jack',age=10),Row(name='lucy',age=12)]
   => df=sc.parallelize(l).toDF()
   => max_age=df.agg(F.max(df.age)).first()[0]
4,groupby 分组聚合
   l=[Row(strategy='zhld',code='01',amount=100),Row(strategy='zhld',code='02',amount=200),Row(strategy='dxzl',code='03',amount=1000)]
   df=sc.parallelize(l).toDF()
   code_count=df.groupBy(df.strategy).agg(F.count(df.code).alias('num'))
   =>[Row(strategy='zhld',num=2),Row(strategy='dxzl',num=1)]
   
5,数据固化到内存的几种方式
如果数据需要经常用到,想基础表,但又不大这样的,可以持续更新到内存
cache  dataframe:df.cache()
6,dataframe 分区的合并
   dataframe始终是要转换成RDD进行计算的,dataframe的分区即为RDD的分区
   df.coalesce(1)  df的分区数合并到1
   df.rdd.getNumPartitions() 返回df的分区数
7,列的删除,有些情况需要关联表,这回引入新的列,可以使用drop,去掉新引入的列
   df=df.drop(df.name)
8, 去重  dropDumplicates()
l=[Row(strategy='zhld',code='01',amount=100),Row(strategy='zhld',code='02',amount=200),Row(strategy='dxzl',code='03',amount=1000)]
   df=sc.parallelize(l).toDF()
   df2=df.dropDumplicates(df.strategy)
9,fileter  None 值过滤,filter()接受True|False
df=df.filter(df.name.isNull())
df=df.filter(df.name.isNotNull())
10,求并集 intersec,求差集subtract
   l=[Row(strategy='zhld',code='01',amount=100),Row(strategy='zhld',code='02',amount=200),Row(strategy='dxzl',code='03',amount=1000)]
   df=sc.parallelize(l).toDF()
   df1=df.filter(df.strategy=='zhld')
   df2=df.intersect(df1)
   df3=df.subtract(df1)
11,replace 替换
    a=sc.parallelize([('alice',20,'beijing'),('john',30,'shanghai')])
    age=Row('name1','age','addr')
    a=a.map(lambda r:age(*r)).toDF()
    c=a.replace('alice','stefan',name1)
    c=a.replace(['alice','john'],['stefan','jace'],name)
12,show()查看dataframe 数据情况
13,select 中可以使用数据类型提供的函数
    整形的 between():a=ch.select(ch.name,ch.age.between(3,5).alias('flag')).show()    返回True|False
    字符串的 endswith():b=a.select(a.name,a.name.endswith('n'))
    字符串的 substr:a=ch.select(ch.age,ch.name.substr(2,3).alias('name1'))  从第二个字符开始,供三个字符
    F.when a=ch.select(ch.name,F.when(ch.age>3,1).when(ch.age<=3,-1).otherwise(0).alias('flag'))
    F提供的正则表达式:a=temp.select(F.regexp_extract(temp.str,'(\d+)-(\d+)',1).alias('d')
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ZhanYunQI/article/details/70854516

智能推荐

oracle materialized view 不刷新,materialized view 刷新非常慢!急,急-程序员宅基地

建立 materialized log 如下:create materialized view log on request with rowid;create materialized view log on product with rowid;create materialized view log on active_request_leg_map with rowid;create ma...

Leetcode复盘6——数组与矩阵_for(int[] nums : matrix)-程序员宅基地

Leetcode复盘6——数组与矩阵导读1.移动零 / 把数组中的 0 移到末尾相同(Leetcode283)难度:简单Easyidea:定义一个游动下标idx,先把nums里非零数字放到前面,再把后面的位置置0取数组大小,Java里是nums.length,C++是nums.size()代码:C++版class Solution {public: void moveZeroes(vector<int>& nums) { //_for(int[] nums : matrix)

在eclipse中将bpmn文件转成png图片_bpmn转图片-程序员宅基地

1.bpmn文件当前页面2.当前页面点击右键,选择Export Diagram(或者是快捷键crtl+o),会弹出以下界面3.选择格式.png,点击ok4.然后弹出要保存在那里,点击保存就得到此bpmn文件的png图片了_bpmn转图片

123457123456#0#-----com.cym.shuXue02--前拼后广--开心学数学-程序员宅基地

com.cym.shuXue02--前拼后广--开心学数学转载于:https://www.cnblogs.com/Ewenblog/p/8961659.html

随便推点

出现 DataFrame object has no attribute ‘as_matrix‘ 错误_dataframe object has no attribute as_matrix-程序员宅基地

原因:新库删去了as_matrix操作df.as_matrix()改成df.values,比如将data = data.as_matrix(columns = None) 改为data = data.values错误来源于 简单的用户流失预警实战https://blog.csdn.net/qq_43653405/article/details/107875825..._dataframe object has no attribute as_matrix

Windows 终端常用命令,必备!_windows终端常用命令_Linux猿的博客-程序员宅基地

???? 作者:Linux猿???? 简介:程序员宅基地专家????,华为云享专家????,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!???? 关注专栏:xxxxxxx (优质好文持续更新中……)???????? 欢迎小伙伴们点赞????、收藏、留言????大家在 Windows 控制台(黑框)中执行命令的时候,是不是经常输错命令呢?经常与 Linux 的命令混淆了,这篇文章就来总结下 Windows 控制台的命令。一、什么是 Windows 控制台W_windows终端常用命令

Windows客户端使用frp访问Linux服务器端_frpc在windows上安装客户端,使用云端linux ip可以通吗-程序员宅基地

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。1、frp下载(Windows&Linux)地址:https://github.com/fatedier/frp/releases/2、根据对应的操作系统及架构,从 Release 页面下载最新版本的程序。将 frps 及..._frpc在windows上安装客户端,使用云端linux ip可以通吗

ios 远程推送_ios 远程推送设置-程序员宅基地

转载地址:http://blog.csdn.net/shenjie12345678/article/details/41120637#comments好久没有写过博客啦,今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触iOS的人会很想了解一下。(ps_ios 远程推送设置

angular6 懒加载 修改默认路由-程序员宅基地

先放个官网教程地址(angular中文网 -路由) https://www.angular.cn/tutorial/toh-pt5 懒加载(惰性加载的特性模块) https://www.angular.cn/guide/lazy-loading-ngmodules首先 你带有个ng项目ng new customer-app --routi...

黑马程序员-基本数据类型-程序员宅基地

byte(字节型) 长度:1, 范围:-128~127 short(短整型) 长度: 2, 范围: -32768~32767 int(整型) 长度:4, 范围: -2147483648~2147483647 long(长整型) 长度: 8 , 范围: -9223372036854775808 ~ 922337203685477580

推荐文章

热门文章

相关标签