我们要查询类似以下结构的数据,但是要筛选出指定key值的数据。
在这里插入图片描述

一般方法将数组covers字段进行explode()操作展开,生成一个包含covers中struct类型元素的临时表,然后再将临时表中的struct类型字段的各个字段展开。最终生成一个id,key,type的表。得到这个表时便可以指定key进行查询了。但是这个方法需要进行三步,非常麻烦。

使用 LATERAL VIEW explode(covers) adTable AS cover 可以一步到位。

LATERAL VIEW介绍

语法格式:

LATERAL VIEW [ OUTER ] generator_function ( expression [ , ... ] ) [ table_alias ] AS column_alias [ , ... ]

假设我们已经有如下表:

pageidcol1col2
front_page[1, 2, 3][“a”, “b”, “c”]
contact_page[3, 4, 5][“d”, “e”, “f”]
  • 单个Lateral View语句
select pageid, col1_new, col2 from pageAds lateral view explode(col1) adTable as col1_new;
+--------------+------------+---------------+
| pageid       | col1_new   | col2          |
+--------------+------------+---------------+
| front_page   | 1          | ["a","b","c"] |
| front_page   | 2          | ["a","b","c"] |
| front_page   | 3          | ["a","b","c"] |
| contact_page | 3          | ["d","e","f"] |
| contact_page | 4          | ["d","e","f"] |
| contact_page | 5          | ["d","e","f"] |
+--------------+------------+---------------+
  • 拆分col1并执行聚合统计。
select col1_new, count(1) as count from pageAds lateral view explode(col1) adTable as col1_new group by col1_new;
+------------+------------+
| col1_new   | count      |
+------------+------------+
| 1          | 1          |
| 2          | 1          |
| 3          | 2          |
| 4          | 1          |
| 5          | 1          |
+------------+------------+
  • 多个Lateral View语句
select pageid,mycol1, mycol2 from pageAds 
    lateral view explode(col1) myTable1 as mycol1 
    lateral view explode(col2) myTable2 as mycol2;
+--------------+----------+----------+
| pageid       | mycol1   | mycol2   |
+--------------+----------+----------+
| front_page   | 1        | a        |
| front_page   | 1        | b        |
| front_page   | 1        | c        |
| front_page   | 2        | a        |
| front_page   | 2        | b        |
| front_page   | 2        | c        |
| front_page   | 3        | a        |
| front_page   | 3        | b        |
| front_page   | 3        | c        |
| contact_page | 3        | d        |
| contact_page | 3        | e        |
| contact_page | 3        | f        |
| contact_page | 4        | d        |
| contact_page | 4        | e        |
| contact_page | 4        | f        |
| contact_page | 5        | d        |
| contact_page | 5        | e        |
| contact_page | 5        | f        |
+--------------+----------+----------+
  • 对于struct类型可以使用 "."直接取数
select id,cover.key as k, cover.type as t from tablename lateral view explode(covers) myTable1 as cover where cover.key = 'special'
                    背景我们要查询类似以下结构的数据,但是要筛选出指定key值的数据。解决方案一般方法将数组covers字段进行explode()操作展开,生成一个包含covers中struct类型元素的临时表,然后再将临时表中的struct类型字段的各个字段展开。最终生成一个id,key,type的表。得到这个表时便可以指定key进行查询了。但是这个方法需要进行三步,非常麻烦。使用LATERAL VIEW explode(covers) adTable AS cover可以一步到位。LATERAL VIEW介绍
				
赠送jar包:mapstruct-1.1.0.Final.jar; 赠送原API文档:mapstruct-1.1.0.Final-javadoc.jar; 赠送源代码:mapstruct-1.1.0.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-1.1.0.Final.pom; 包含翻译后的API文档:mapstruct-1.1.0.Final-javadoc-API文档-文(简体)版.zip; Maven坐标:org.mapstruct:mapstruct:1.1.0.Final; 标签:mapstruct文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档的代码和结构保持不变,注释和说明精准翻译,请放心使用。
温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文的图片放大查看高清原图。 Fayson的github: https://github.com/fayson/cdhproject 提示:代码块部分可以左右滑动查看噢 1.文档编写目的 Hive支持多种数据类型除了常用的TINYINT、SMALLINT、INT、BIGINT、BOOLEAN、FLOAT、DOUBLE、STRING、BINARY、TIMESTAMP、DECIMAL、DATE、VARCHAR、CHAR类型外,当然还包含一些复杂的数据类型array、map、struct、union)。本篇文章Fayson主要介绍在
赠送jar包:mapstruct-1.3.1.Final.jar; 赠送原API文档:mapstruct-1.3.1.Final-javadoc.jar; 赠送源代码:mapstruct-1.3.1.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-1.3.1.Final.pom; 包含翻译后的API文档:mapstruct-1.3.1.Final-javadoc-API文档-文(简体)版.zip; Maven坐标:org.mapstruct:mapstruct:1.3.1.Final; 标签:mapstruct、jar包、java、文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档的代码和结构保持不变,注释和说明精准翻译,请放心使用。 机器学习的分类模型有逻辑回归、朴素贝叶斯、决策树、支持向量机、随机森林、梯度提升树等分类算法,不仅可以进行二分类,还可以进行多分类。 一、逻辑回归 逻辑回归的本质就由线性回归演变而来,是一个线性分类器。sklearn实现的LogisticRegression不仅可用于二分类,也可以用于多分类。 模型训练速度非常快,计算量只与特征的数目有关。 模型的可解释性非常好,从特征的权重可以看到不同特征对最后结果的影响。 内存资源占用小,只需要存储特征权重等信息。 逻辑回归的抗噪能力比较强。 SSE(sum squared error,和方差),其公式为:sse=∑i=1m(yi−y^i)2sse=\sum_{i=1}^m(y_i-\hat y_i)^2sse=i=1∑m​(yi​−y^​i​)2其,yiy_iyi​是真实值,y^i\hat y_iy^​i​表示预测值。 MSE(mean squared error,均方误差),其公式为:mse=1m∑i=1m(yi−y^i)2mse=\frac{1}{m}\sum_{i=1}^m(y_i-\hat y_i)^2mse=m1​i
import org.apache.spark.sql.{SparkSession, Row} import org.apache.spark.sql.types.{StructType, StructField, StringType} object First_Question { def main(args: Array[String]): Unit = { /******************* Begin *******************/ // 创建 SparkSession // 读取文件,创建 RDD // 定义 Schema // 将 RDD 转换为 DataFrame // 按指定格式打印出数据 // 释放资源 /******************* End *******************/ } }
import org.apache.spark.sql.{SparkSession, Row} import org.apache.spark.sql.types.{StructType, StructField, StringType} object First_Question { def main(args: Array[String]): Unit = { /******************* Begin *******************/ // 创建 SparkSession val spark = SparkSession.builder() .appName("First_Question") .master("local[*]") .getOrCreate() // 读取文件,创建 RDD val fileRDD = spark.sparkContext.textFile("/path/to/file") // 定义 Schema val schema = StructType(Array( StructField("col1", StringType, true), StructField("col2", StringType, true), StructField("col3", StringType, true) // 将 RDD 转换为 DataFrame val dataDF = spark.createDataFrame(fileRDD.map(_.split(",")).map(attributes => Row(attributes(0), attributes(1), attributes(2))), schema) // 按指定格式打印出数据 dataDF.show() // 释放资源 spark.stop() /******************* End *******************/ 需要注意的是,这里的代码仅供参考,具体实现需要根据实际情况进行修改。
《【FedBCD】A Communication-Efficient Collaborative Learning Framework for Distributed Features》论文阅读 《PFL》论文阅读笔记 《NTP-VFL - A New Scheme for Non-3rd Party Vertical Federated Learning》模型原理