hive、spark函数大全

本文深入探讨了Hive和Spark的高级功能,包括日期处理、数学与字符串函数、数据优化技巧等,同时提供了丰富的代码示例和性能优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、hive

1、日期 (hive没有date类型)
1)、获取时间
current_date 2019-05-07
current_timestamp/now() 2019-05-07 15:20:49.247
2)、从日期时间中提取字段
year(''),month(''),day/dayofmonth,hour(''),minute(''),second(''),dayofweek(),dayofyear(),weekofyear()
trunc('2009-02-12', 'MM')截取某部分的日期,其他部分默认为01第二个参数 ["year", "yyyy", "yy", "mon", "month", "mm"]
3)、日期时间转换
unix_timestamp返回当前时间的unix时间戳:
unix_timestamp()当前时间,unix_timestamp('2016-04-08', 'yyyy-MM-dd')。
from_unixtime(0, 'yyyy-MM-dd HH:mm:ss');时间戳对应时间,联合unix_timestamp使用可以把字符串转换成不同格式的日期。
to_date/date()返回时间字符串的日期部分。

4)、日期计算
months_between('1997-02-28 10:30:00', '1996-10-30')两个日期之间的月数
datediff('2009-07-31', '2009-07-30');两个日期之间的天数
add_months('2016-08-31', 1)日期加n月
last_day(date)当月的最后一天
date_add('2016-07-30', 1)
date_sub('2016-07-30', 1)
2、数值函数
round(3.1415926) 返回 BIGINT;round(double a, int d)返回DOUBLE
floor(double a)ceil(double a)
 rand()取随机数函数
 abs(double a) 绝对值
3、字符串函数

concat_ws(',','abc','def','gh')带分隔符字符串连接函数

upper('abSEd')
lower('abSEd')
trim(' abc ')
regexp_replace('foobar', 'oo|ar', '')正则表达式替换

from_json('{"k": "fruit", "v": "apple"}','k STRING, v STRING', map("",""))
json_tuple('{"name":"jack","server":"www.qq.com"}','server','name')
cast(1 as bigint)类型转换

substr(string A, int start, int len)
substr(string A, int start)

split(regexp_replace(msg,'\\\\x22','"'),' -')[1]
 

5、默认值coalesce(name,"")
解决join空值中的坑。
6、多行拼接concat_ws
concat_ws('_',collect_set(promotion_id)collect_set的作用是对promotion_id去重

7、解析list为多行

json_extract

select union_id
        ,get_json_object(tag1,'$.url') audit_content
from (  
select union_id
        ,substr(get_json_object(audit_content,'$.images'),2,length(get_json_object(audit_content,'$.images'))-2) audit_content
from table
            WHERE   pt = "${bizdate}" and get_json_object(audit_content,'$.images')<>'[]'
) ta  lateral view explode(split(audit_content, ',')) r1 as tag1 ;

explore(c_map) b AS map_key, map_value;

presto

select id,new_name from table

cross join unnest(split(name,','))  as tmp(new_name )

alter table tablename add columns(columnname string) ;

删除外部表,先将外部表改为内部表

alter table test_external  set TBLPROPERTIES('EXTERNAL'='false');

alter table test_external   change column etl_time etl_time string COMMENT '数据时间';

alter table app.example_orc partition (dt="20180505") concatenate;合并小文件

ALTER TABLE my_partition_test_table DROP IF EXISTS PARTITION (p_loctype='MHA');
GET_JSON_OBJECT(tag_cont,'$[*].tag')
alter table my_partition_test_table if not exists add partition (p_hour='2017113003', p_city='573', p_loctype='MHA');

查询除了当前这条数据的其他数据并合并

replace(replace(concat_ws(';',collect_set(concat(commentid,':',hot_score))over()),concat(';',commentid,':',hot_score),''),concat(commentid,':',hot_score,';'),'') as comment_list,

窗口中按指定条件排序:

1、将指定条件的数据查出来添加排序字段;

2、first_value(case when act_semantic='pv_out' then extra_info else null end) over(partition by device_id, sinfo['req_id'], sinfo['object_id'] order by case when act_semantic='pv_out' then log_time else 0 end desc) as extra_info,

split( regexp_replace(regexp_replace(GET_JSON_OBJECT(ext1, '$[*].accounts'), '\\[+\\[+\\{', ''), '\\}+\\]+\\]', ''), '\\}+\\]+\\,+\\[+\\{') )获取list里面所有accounts值

array_contains

array_distinct

cardinality presto查询数组/map大小

spark concat 连接两个数组

to_json map转json

str_to_map json  转map

MSCK REPAIR TABLE 外部表数据复原

解决hive外部表创建_success问题

"mapreduce.fileoutputcommitter.marksuccessfuljobs": false

数据治理

 hadoop fs -du -s -h oss://bigdata/data_warehouse/xxxxxxxxx

hadoop fs -rm -r -skipTrash   oss://bigdata/data_warehouse/xxxxxxxxx

hadoop fs -ls   oss://bigdata/data_warehouse/xxxxxxxxx |wc -n 100

二、spark


SparkSession
val conf = new SparkConf().setAppName("SparkWithHive_Sparkv21")
val sparkSession = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate()
sql
spark.sql("") 返回DataFrame
DataFrame方法:
show(n)默认展示20条记录
collect()获取所有数据到数组返回Array对象,map(r=>())
collectAsList()获取所有数据到List
first, head, take, takeAsList:获取若干行记录
where($"")<=>filter($"")条件筛选
select("","")查询指定
distinct()返回一个不包含重复记录的DataFrame 
withColumn("period",$"")新增一列,$""取列值,lit(1)给默认值。
withColumnRenamed("原名","新名")
$""的操作:
length($"")
$"".cast(String)
when($""=,)otherwise()
自定义方法
def findHentai(sex:String,dressing:String): String ={
      if(sex =="boy" && dressing == "裙子") "变态" else "正常"
}
声明
var check_amt_udf = udf(findHentai _)
调用
check_amt_udf.apply($"",$"")

join
df1.join(df2):笛卡尔积
多个相同字段形式 
df1.join(df2, Seq("id","name"))
不相同字段
df1.join(df2 , df1("id" ) === df2( "t1_id"))
指定join类型
df1.join(df2, Seq("id","name"),"left")

groupBy("").agg(
max("").alias(""),
collect_list("") as ""
)


三、spark定义


类 object
方法def f():Unit={}
变量var
常量val
spark 循环
df.foreachPartition(partition => {partition.foreach(line => {line.get(line.fieldIndex(dimensionColumn))})})
var index=Map("t1111dacu_rgst"->"1111dacu_rgst")
index+=("t1212dacu_rgst"->"1212dacu_rgst")
index.foreach{case (k,v) => {}}

四、优化

SparkSQL执行时参数优化 - 不会叫的喵· - 博客园

spark从hdfs里面获取数据分区数是不可设定的,如果后面有复杂的处理逻辑,需要使用宽依赖算子如distinct使stage拆分,再设置partition。或者使用分桶的方法。

spark优化:
spark.conf.set("spark.sql.shuffle.partitions",1000)
df.repartition(1000).persist()

Hive任务优化
1、    map一直等于0%,set hive.auto.convert.join = false转成reduce端的Common Join。
2、    reduce一直是99%,可能是reduce太少(默认是3亿),SET hive.exec.reducers.bytes.per.reducer=1000000000;单个reduce人处理的数据量或set mapred.reduce.tasks=80;。   
3、    hive.groupby.skewindata group by数据倾斜。hive.map.aggr=true 这个配置项代表是否在map端进行聚合
4、    set hive.optimize.skewjoin = true; join数据倾斜set hive.skewjoin.key =4*(count-reducer)
5、    join or 用union all GROUP BY这样替代
6、    Error: Java heap space 设置内存set mapreduce.map.memory.mb=4096; set mapreduce.map.java.opts=-Xmx3600m;
 

PySpark之列操作 - 简书

### 回答1: HiveSpark都是大数据领域中非常热门的开源框架,常用于分布式数据处理和分析,两者之间也有很多的协作和融合。而在Spark 3.0版本中,集成了一个Hive 3.0版本,使得开发者可以更加轻松地在Spark中使用Hive特性。 通过编译Hive Spark 3.0版本,我们可以得到一个支持Hadoop 3.2的Hive版本,并且集成了新版Spark的功能。这个版本不仅可以提升开发者的编程效率和数据处理速度,同时也对一些性能上的问题进行了修复和优化,提升了整体的稳定性和可靠性。 在使用编译好的Hive Spark 3.0版本时,我们可以通过类似于Hive CLI的方式来使用Hive,也可以通过Spark SQL的方式来使用。同时,还有许多针对Spark执行计划优化和查询优化的特性,使得我们可以更加高效地管理和分析数据。 总而言之,编译好的Hive Spark 3.0版本是一个强大又稳定的数据处理和分析工具,可以帮助开发者快速准确地处理大规模数据,提升业务价值和竞争力。 ### 回答2: Hive Spark 3.0是指在Apache Hive平台中,使用了Spark 3.0作为计算引擎进行编译的版本。 Apache Hive是一个基于Hadoop平台的数据仓库系统,旨在处理大数据集并提供一种简单的查询语言来查询和分析数据。 使用Spark作为计算引擎的好处在于,它能够利用内存计算技术快速处理数据,并且提供了许多高级的API和工具,可以进行复杂的数据分析和数据挖掘操作。同时,Spark还能够与其他大数据组件如Hadoop、HBase等无缝集成,因此是处理大数据的一个很好的选择。 通过编译好的Hive Spark 3.0,用户可以使用HiveQL查询语言进行数据分析,同时发挥Spark的高效性能来加速计算过程。此外,Hive Spark 3.0还支持流式数据处理和机器学习等高级特性,使数据处理更加灵活和多样化。 总之,Hive Spark 3.0编译好的版本集合了Apache HiveSpark这两个强大的工具,提供了一个高效且易于使用的平台来进行大数据分析和处理。 ### 回答3: Hive Spark 3.0编译好的意味着用户已经成功编译了Apache HiveSpark 3.0版本,使其可在Apache Hadoop集群上运行。Spark 3.0是Apache Spark的最新版本,拥有更多的改进和新功能。通过Hive Spark 3.0,用户可以利用Spark的高性能计算能力和Hive的数据仓库功能进行数据处理和分析。 Hive是一种基于Hadoop的数据仓库工具,Spark是一种基于内存计算引擎的分布式计算系统,两者结合可以更有效地处理大量数据。Hive Spark 3.0编译好的版本具有更好的性能和可扩展性,可以轻松地扩展到数百或数千个计算节点,并且可以快速处理PB级别的数据。 使用Hive Spark 3.0,用户可以使用SQL查询语言来处理数据,而无需大量的编程。它还提供了许多内置函数和聚合函数,可以轻松地进行数据操作和统计分析。此外,用户还可以使用可视化工具来创建和执行查询,以更直观地了解数据。 总之,Hive Spark 3.0编译好的版本为个人和企业用户提供了一种快速高效地处理海量数据的解决方案,为数据分析和业务决策提供了更有力的支持。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值