4、Spark DataFrame理解和使用之不同数据类型的操作(一)

这里介绍以下数据类型操作:

Booleans布尔型

Numbers数值型

Strings字符型

日期和复杂类型数据操作见博客 5、Spark DataFrame理解和使用之不同数据类型的操作(二)

常用的处理模块有DataFrameStatFunctions(统计分析模块) 和DataFrameNaFunctions(处理缺失值模块),里面包含很多相应场景中会用到的函数和方法。Column方法,包含一些跟处理列相关的方法,比如alias,contains等。org.apache.spark.sql.functions包含处理各种数据类型的一些函数,这个模块太常用了,我们经常会把整个包引入。

Booleans型

布尔型是所有filter过滤操作的基础,所以也是数据分析的基础。它包含四个元素:and,or,true,false。我们会根据这四个简单的结构来构造逻辑判定式,当数据中的一行传入时,我们就把逻辑当作条件来判断输入是true还是false,然后决定此行数据是通过检验还是不通过被过滤掉。

1、有哪些函数或方法可以生成true和false?

  • 等于:equalTo() , ===
  • 不等于: not equalTo() ,=!=
  • 大于:  >
  • 小于: < 
import org.apache.spark.sql.functions.{expr, not, col}
//等于 equalTo()
df.where(col("InvoiceNo").equalTo(536365)) 
  .select("InvoiceNo", "Description") 
  .show(5, false)
//等于 ===
df.where(col("InvoiceNo") === 536365) 
  .select("InvoiceNo", "Description") 
  .show(5, false)
//不等于 =!=
df.where(col("InvoiceNo") =!= 536365) 
  .select("InvoiceNo", "Description") 
  .show(5, false)
//大于 not(leq())
df.where(not(col("UnitPrice").leq(250))) 
  .select("UnitPrice","Description")
  .show(5)
//大于 Not <=
df.where(expr("NOT UnitPrice <= 250")) 
  .select("UnitPrice","Description")
  .show(5)

2、如何使用 and,or 来构造逻辑判定式呢?

在spark中把过滤条件串联起来就是and且的逻辑,不必须用and来明确的写出来。而or的逻辑则需要明确的写出来。

  • 逻辑判定式当作过滤条件,与where操作一起使用来过滤DataFrame
//过滤条件a
val priceFilter = col("UnitPrice") > 600
//过滤条件b
val descripFilter = col("Description").contains("POSTAGE")
//用or明确的表示过滤条件a、b的或的逻辑关系。 而没有明确写出来的and且的逻辑是通过两个where的串联实现的
df.where(col("StockCode").isin("DOT")) 
  .where(priceFilter.or(descripFilter)) .show(5)
  • 逻辑判定式当作表达式,与withColumn一起使用构造新的列。当然也可以依据此布尔型的新列来过滤DataFrame。
val DOTCodeFilter = col("StockCode") === "DOT"
val priceFilter = col("UnitPrice") > 600
val descripFilter = col("Description").contains("POSTAGE")
df.withColumn("isExpensive", DOTCodeFilter.and(priceFilter.or(descripFilter)))
.where("isExpensive") 
.select("unitPrice", "isExpensive") 
.show(5)

Numbers数值型

1、向上取整round,向下取整bround

//scala
import org.apache.spark.sql.functions.lit
df.select(round(lit("2.5")),bround(lit("2.5"))).show()

#python
from pyspark.sql.function import lit,round,bround
df.select(round(lit("2.5")),bround(lit("2.5"))).show()

-- Sql
SELECT round(2.5),bround(2.5)

2、计算两数值列相关性 corr()

3、聚合函数 count,mean,stddev_pop,min,max

4、stat函数库 (如,近似分位数df.stat.approxQuantile())

5、给每行一个独立的行号 monotonically_increasing_id()

6、随机数函数 rand(),randn()

Strings字符型

1、首字母大写函数initcap()

2、大小写函数 lower(), upper()

3、去除空格 ltrim(), rtrim(), trim()

4、占位符补齐 rpad(), lpad()

Regular Expressions 正则表达式

1、查找 regexp_extract("$列", "$要查找的字符串", "$n第几个匹配到词")

2、字符串维度替换 regexp_replace("$要替换的列","$要替换的词","$替换成的词")

// in Scala, 正则表达式中 | 代表或的关系
import org.apache.spark.sql.functions.regexp_replace
val simpleColors = Seq("black", "white", "red", "green", "blue")
val regexString = simpleColors.map(_.toUpperCase).mkString("|")
df.select(
regexp_replace(col("Description"), regexString, "COLOR").alias("color_clean"),
col("Description")).show(2)

# in Python
from pyspark.sql.functions import regexp_replace
regex_string = "BLACK|WHITE|RED|GREEN|BLUE"
df.select(
regexp_replace(col("Description"), regex_string, "COLOR").alias("color_clean"),
col("Description")).show(2)

-- in SQL
SELECT
regexp_replace(Description, 'BLACK|WHITE|RED|GREEN|BLUE', 'COLOR') as
color_clean, Description
FROM dfTable

3、字符维度替换translate("$列", "$字符" ,"$替换字符")

//按字符进行查找和替换,L替换成1,E替换成3,T替换成7
// in Scala
import org.apache.spark.sql.functions.translate
df.select(translate(col("Description"), "LEET", "1337"), col("Description"))
.show(2)

# in Python
from pyspark.sql.functions import translate
df.select(translate(col("Description"), "LEET", "1337"),col("Description"))\
.show(2)

-- in SQL
SELECT translate(Description, 'LEET', '1337'), Description FROM dfTable

4、是否包含某字符串 .contains()

scala中用contains函数
// in Scala
val containsBlack = col("Description").contains("BLACK")
val containsWhite = col("DESCRIPTION").contains("WHITE")
df.withColumn("hasSimpleColor", containsBlack.or(containsWhite))
.where("hasSimpleColor")
.select("Description").show(3, false)

python和sql中用 instr函数
# in Python
from pyspark.sql.functions import instr
containsBlack = instr(col("Description"), "BLACK") >= 1
containsWhite = instr(col("Description"), "WHITE") >= 1
df.withColumn("hasSimpleColor", containsBlack | containsWhite)\
.where("hasSimpleColor")\
.select("Description").show(3, False)

-- in SQL
SELECT Description FROM dfTable
WHERE instr(Description, 'BLACK') >= 1 OR instr(Description, 'WHITE') >= 1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值