几种给Dataset增加列的方式

首先创建一个DF对象:

scala> spark.version
res0: String = 2.2..cloudera1 scala> val df = spark.createDataset(Seq(("key1", , 1.0), ("key1", , 2.0))).toDF("id", "rsrp", "rsrq")
df: org.apache.spark.sql.DataFrame = [id: string, rsrp: int ... more field] scala> df.show
+----+----+----+
| id|rsrp|rsrq|
+----+----+----+
|key1| | 1.0|
|key1| | 2.0|
+----+----+----+ scala> df.printSchema
root
|-- id: string (nullable = true)
|-- rsrp: integer (nullable = false)
|-- rsrq: double (nullable = false)

第一种方式:使用lit()增加常量(固定值)

可以是字符串类型,整型

scala> df.withColumn("sinurl", lit()).show
+----+----+----+------+
| id|rsrp|rsrq|sinurl|
+----+----+----+------+
|key1| | 1.0| |
|key1| | 2.0| |
+----+----+----+------+ scala> df.withColumn("type", lit("mr")).show
+----+----+----+----+
| id|rsrp|rsrq|type|
+----+----+----+----+
|key1| | 1.0| mr|
|key1| | 2.0| mr|
+----+----+----+----+

注意:

lit()是spark自带的函数,需要import org.apache.spark.sql.functions

Since 1.3.0
def lit(literal: Any): Column Creates a Column of literal value. The passed in object is returned directly if it is already a Column. If the object is a Scala Symbol, it is converted into a Column also. Otherwise, a new Column is created to represent the literal value.

第二种方式:使用当前已有的某列的变换新增

scala> df.withColumn("rsrp2", $"rsrp"*).show
+----+----+----+-----+
| id|rsrp|rsrq|rsrp2|
+----+----+----+-----+
|key1| | 1.0| |
|key1| | 2.0| |
+----+----+----+-----+

第三种方式:使用select函数增加列

java方式:

import static org.apache.spark.sql.functions.col;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.functions;
import org.apache.spark.sql.api.java.UDF1;
import org.apache.spark.sql.types.DataTypes;
...
private final SimpleDateFormat srcSdf = new SimpleDateFormat("yyyy-MM-dd HH:00:00");
private final SimpleDateFormat destSdf = new SimpleDateFormat("yyyy-MM-dd 00:00:00"); public Dataset<Row> handler(Dataset<Row> esDataset){
UDF1 date_fomat = new UDF1<String, String>() {
private static final long serialVersionUID = 1L; public String call(final String value) throws Exception {
Date date = srcSdf.parse(value);
return destSdf.format(date);
}
};
sparkSession.udf().register("date_fomat_func", date_fomat, DataTypes.StringType); UDF1 to_long = new UDF1<Long, Long>() {
private static final long serialVersionUID = 1L; public Long call(final Long value) throws Exception {
Date date = srcSdf.parse(String.valueOf(value));
return destSdf.parse(destSdf.format(date)).getTime();
}
};
sparkSession.udf().register("to_long_func", to_long, DataTypes.LongType); esDataset=esDataset.withColumn("scan_start_time", functions.callUDF("date_fomat_func", col("scan_start_time")));
esDataset=esDataset.withColumn("scan_stop_time", functions.callUDF("date_fomat_func", col("scan_stop_time")));
esDataset=esDataset.withColumn("timestamp", functions.callUDF("to_long_func", col("timestamp"))); return esDataset;
}
...

scala

scala> import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.DataTypes
scala> df.select(col("*"),
| udf{
| (e:Int) =>
| if(e == "") {
|
| } else {
|
| }
| }.apply(df("rsrp")).cast(DataTypes.DoubleType).as("rsrp_udf")
| ).show
+----+----+----+--------+
| id|rsrp|rsrq|rsrp_udf|
+----+----+----+--------+
|key1| | 1.0| 2.0|
|key1| | 2.0| 2.0|
+----+----+----+--------+
scala> df.select(col("*"),
| when(df("rsrp") > , lit(">10")).when(df("rsrp") === , "=10").otherwise("<10").as("rsrp_compare10")
| ).show
+----+----+----+--------------+
| id|rsrp|rsrq|rsrp_compare10|
+----+----+----+--------------+
|key1| | 1.0| >|
|key1| | 2.0| =|
+----+----+----+--------------+

第四种方式:case when当参数嵌套udf

df.withColumn("r",
when($"rsrp".isNull, lit(null))
.otherwise(udf1($"rsrp"))
.cast(DataTypes.IntegerType)
)

第五种方式:使用expr()函数

scala> df.withColumn("rsrp4", expr("rsrp * 4")).show
+----+----+----+-----+
| id|rsrp|rsrq|rsrp4|
+----+----+----+-----+
|key1| | 1.0| |
|key1| | 2.0| |
+----+----+----+-----+

Dataset删除列

scala> df.drop("rsrp").show
+----+----+
| id|rsrq|
+----+----+
|key1| 1.0|
|key1| 2.0|
+----+----+ scala> df.drop("rsrp","rsrq").show
+----+
| id|
+----+
|key1|
|key1|
+----+

Dataset替换null列

首先,在hadoop目录/user/spark/test.csv

[spark@master ~]$ hadoop fs -text /user/spark/test.csv
key1,key2,key3,key4,key5
aaa,,,t1,
bbb,,,t2,
ccc,,,,
,,,t1,
bbb,,,t3,
,,,t1,

备注:如果想在根目录下执行spark-shell.需要在/etc/profile中追加spark的安装目录:

export SPARK_HOME=/opt/spark-2.2.-bin-hadoop2.
export PATH=$PATH:$SPARK_HOME/bin

使用spark加载.user/spark/test.csv文件

[spark@master ~]$ spark-shell
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
// :: WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Spark context Web UI available at http://192.168.0.120:4040
Spark context available as 'sc' (master = local[*], app id = local-).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.2.
/_/ Using Scala version 2.11. (Java HotSpot(TM) -Bit Server VM, Java 1.8.0_171)
Type in expressions to have them evaluated.
Type :help for more information. scala> val df = spark.read.option("header","true").csv("/user/spark/test.csv")
// :: WARN metastore.ObjectStore: Version information not found in metastore. hive.metastore.schema.verification is not enabled so recording the schema version 1.2.
// :: WARN metastore.ObjectStore: Failed to get database default, returning NoSuchObjectException
// :: WARN metastore.ObjectStore: Failed to get database global_temp, returning NoSuchObjectException
df: org.apache.spark.sql.DataFrame = [key1: string, key2: string ... more fields] scala> df.show
+----+----+----+----+----+
|key1|key2|key3|key4|key5|
+----+----+----+----+----+
| aaa| | | t1| |
| bbb| | | t2| |
| ccc| | |null| |
|null| | | t1|null|
| bbb| | | t3| |
|null| |null| t1| |
+----+----+----+----+----+ scala> df.schema
res3: org.apache.spark.sql.types.StructType = StructType(StructField(key1,StringType,true), StructField(key2,StringType,true),
StructField(key3,StringType,true), StructField(key4,StringType,true), StructField(key5,StringType,true)) scala> df.printSchema
root
|-- key1: string (nullable = true)
|-- key2: string (nullable = true)
|-- key3: string (nullable = true)
|-- key4: string (nullable = true)
|-- key5: string (nullable = true)

一次修改相同类型的多个列的示例。 这里是把key3,key5列中所有的null值替换成1024。 csv导入时默认是string,如果是整型,写法是一样的,有各个类型的重载。

scala>  df.na.fill("",Seq("key3","key5")).show
+----+----+----+----+----+
|key1|key2|key3|key4|key5|
+----+----+----+----+----+
| aaa| | | t1| |
| bbb| | | t2| |
| ccc| | |null| |
|null| | | t1||
| bbb| | | t3| |
|null| || t1| |
+----+----+----+----+----+

一次修改不同类型的多个列的示例。 csv导入时默认是string,如果是整型,写法是一样的,有各个类型的重载。

scala> df.na.fill(Map(("key1"->"yyy"),("key3",""),("key4","t88"),("key5",""))).show
+----+----+----+----+----+
|key1|key2|key3|key4|key5|
+----+----+----+----+----+
| aaa| | | t1| |
| bbb| | | t2| |
| ccc| | | t88| |
| yyy| | | t1||
| bbb| | | t3| |
| yyy| || t1| |
+----+----+----+----+----+

不修改,只是过滤掉含有null值的行。 这里是过滤掉key3,key5列中含有null的行

scala>  df.na.drop(Seq("key3","key5")).show
+----+----+----+----+----+
|key1|key2|key3|key4|key5|
+----+----+----+----+----+
| aaa| | | t1| |
| bbb| | | t2| |
| ccc| | |null| |
| bbb| | | t3| |
+----+----+----+----+----+

过滤掉指定的若干列中,有效值少于n列的行 这里是过滤掉key1,key2,key3这3列中有效值小于2列的行。最后一行中,这3列有2列都是null,所以被过滤掉了。

scala> df.na.drop(,Seq("key1","key2","key3")).show
+----+----+----+----+----+
|key1|key2|key3|key4|key5|
+----+----+----+----+----+
| aaa| | | t1| |
| bbb| | | t2| |
| ccc| | |null| |
|null| | | t1|null|
| bbb| | | t3| |
+----+----+----+----+----+

同上,如果不指定列名列表,则默认列名列表就是所有列

scala> df.na.drop().show
+----+----+----+----+----+
|key1|key2|key3|key4|key5|
+----+----+----+----+----+
| aaa| | | t1| |
| bbb| | | t2| |
| ccc| | |null| |
| bbb| | | t3| |
+----+----+----+----+----+

参考:

https://blog.csdn.net/coding_hello/article/details/75211995

https://blog.csdn.net/xuejianbest/article/details/81666065

Spark:几种给Dataset增加列的方式、Dataset删除列、Dataset替换null列的更多相关文章

  1. spark 三种数据集的关系(一)

    Catalyst Optimizer: Dataset 数据集仅可用Scala或Java.但是,我们提供了以下上下文来更好地理解Spark 2.0的方向数据集是在2015年作为Apache Spark ...

  2. Spark获取DataFrame中列的方式--col,$,column,apply

    Spark获取DataFrame中列的方式--col,$,column,apply 1.官方说明 2.使用时涉及到的的包 3.Demo 原文作者:大葱拌豆腐 原文地址:Spark获取DataFrame ...

  3. spark 三种数据集的关系(二)

    一个Dataset是一个分布式的数据集,而且它是一个新的接口,这个新的接口是在Spark1.6版本里面才被添加进来的,所以要注意DataFrame是先出来的,然后在1.6版本才出现的Dataset,提 ...

  4. spark 四种模式

    Spark 三种运行模式  一:Spark On Local     此种模式下,我们只需要在安装Spark时不进行hadoop和Yarn的环境配置,只要将Spark包解压即可使用,运行时Spark目 ...

  5. 一种更高查询性能的列存储方式MaxMinT 第一部分

    简介本文描述了一种列存储方式和对应的查询方法,这种存储方式具有更好的查询性能和更小的存储空间. And查询 本文先用直观的图形方式展示and查询时的方式,这也是算法要解决的问题核心.通常在OLAP数据 ...

  6. Spark两种内存管理

    Spark动态内存管理 Spark 1.6 后改为动态内存管理(如果想启用静态内存管理,方法下面会介绍),启动动态主要体现在 存储内存和执行内存的动态.

  7. 只用css实现“每列四行,加载完一列后数据自动填充到下一列”的效果

    只用css实现“每列四行,加载完一列后数据自动填充到下一列”的效果.这个题目用图表示如下: 如果将题目换成“只用css实现每行四列,加载完一行后数据自动填充到下一行”,那这个问题就简单多了,相信大家都 ...

  8. 在Winform开发中,我们使用的几种下拉列表展示字典数据的方式

    在Winform开发中中,我们为了方便客户选择,往往使用系统的字典数据选择,毕竟选择总比输入来的快捷.统一,一般我们都会简单封装一下,以便方便对控件的字典值进行展示处理,本篇随笔介绍DevExpres ...

  9. 四种常见的 POST 提交数据方式--good

    HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文 ...

随机推荐

  1. java多线程快速入门(七)

    什么是守护线程 守护线程是为用户线程服务的这么一个线程,主线程结束,守护线程也结束 package com.cppdy; class MyThread3 extends Thread{ @Overri ...

  2. C++ code:prime decision

    1 判断一个数是否为素数 对于判断一个数m是否为素数,最朴素的方式是按照素数的定义,试除以从2开始到m-1的整数,倘若无一例外地不能整除,则该数必为素数. #include<iostream&g ...

  3. 扩展欧几里得,解线性同余方程 逆元 poj1845

    定理:对于任意整数a,b存在一堆整数x,y,满足ax+by=gcd(a,b) int exgcd(int a,int b,int &x,int &y){ ){x=,y=;return ...

  4. docker 运行Django项目

    一.概述 已经写好了一个Django项目,需要将这个项目用docker封装一个镜像,使用k8s发布! 在封装并运行的过程中,发现了很多问题,这里会一一介绍! 二.时区问题 采用的是镜像是 ubuntu ...

  5. Web开发.net framework 类库中必须掌握的命名空间(或者类)【转】

    Web开发常用命名空间和类. System.Collections //命名空间包含接口和类,这些接口和类定义各种对象(如列表.队列.位数组.哈希表和字典)的集合.System.Collections ...

  6. 《剑指offer》青蛙跳台阶

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 很裸的斐波那契数列. class Solution { public: int jumpFloor ...

  7. Redis与Zookeeper实现分布式锁的区别

    Redis实现分布式锁 1.根据lockKey区进行setnx(set not exist,如果key值为空,则正常设置,返回1,否则不会进行设置并返回0)操作,如果设置成功,表示已经获得锁,否则并没 ...

  8. 解决/bin/sh: 1: syntax error: "(" unexpected错误,以及更换bash仍然无法解决的问题

    编译文件的时候出现 /bin/sh: 1: syntax error: "(" unexpected 错误. 网上查到的资料都是: (1)在脚本前写#!/bin/bash (2)执 ...

  9. win10下安装scala

    win10安装scala详细步骤 1.下载安装JDK 2.配置Java环境变量 JAVA_HOME:jdk的安装目录 Path:%JAVA_HOME%\bin; Classpath:%JAVA_HOM ...

  10. BZOJ1040 [ZJOI2008]骑士 基环树林(环套树) 树形动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题意概括 有n个人,每一个人有一个最恨的人. 并且,每一个人有一个权值. 一个人不可以和他最恨的人同时被选中. 现在请你求出在 ...