数组的相关介绍

在上一篇文章中,简单讲述了猜数字游戏的相关内容。本篇内容会讲解数组的相关内容,走过路过不要错过,对你或许有帮助哦~

1.数组的概念

既然我们要学习数组,那肯定少不了数组的概念,那就简单了解一下什么是数组!

我们的日常生活中肯定会对一些相关的或者相同类型的物品进行分类,举个栗子:易碎品和塑料品。数组其实也就是这个意思,我们把属性相同的元素放在同一个小组里,就形成了数组。

所以总而言之,数组是一组相同类型元素的集合。

从概念中我们可以了解数组中包含的元素至少有一个,不能为0;同时元素类型必须是相同的。

2.数组的创建

了解完相关概念之后,我们来看看数组的结构。

type name[常量值]

 type-----表示数组元素的类型

name-----表示数组的名字

[常量值]-----表示数组的大小的

是不是很简单易于理解呢?结合概念我们就可以创建出我们的第一个数组了。例如:创建一个数组存放10个自然数,我么都知道自然数是整数,那就说明数组是整形数组,有10个元素!

int number[10];

 同理其他元素初始化也是如此。

char ch[5];
float arr1[5];
double arr2[5];

看是不是很简单呢?创建好数组后,就有人问能不能放一些元素进去?-----答案当然是YES。我们只需要在后面加上一个括号即可(其实就是后面要讲的初始化)。

int arr[10]={1,2,3,4,5,6,7,8,9,0};

3.数组的初始化

在前面讲创建变量的时候,我们给变量初始化过。其实数组的初始化是类似的,只不过数组的初始化需要一个花括号,在花括号内部初始化,有同学估计没有明白我的意思,那就通过代码看看吧。

int num[5]={1,2,3,4,5};
int age[3]={12,15,18};//这就是初始化

但数组初始化也有同变量不一样的地方,就是数组初始化分为完全初始化和不完全初始化。

就如上面的代码,我们创建了大小为10的数组,我们在花括号中将每一个元素都初始化了。这就是完全初始化,每一个元素都被初始化。

那什么是不完全初始化?显而易见就是不把每一个元素初始化,例如我就想只初始化3个,如下:

int arr[10]={1,2,3};//不完全初始化,后面没有初始化的元素默认为0

那如果我一不小心初始化多了它会造成什么效果?------初始化多了系统会报警告(初始化项太多),这个时候我们就要修改大小或者初始化个数。

4.数组的类型

在C语言中,基本上变量大多有类型的,数组也不例外,那么数组的类型是什么呢?也是int、short、float、double类型的吗?-----答案是NO

在C语言中,我们把数组名去掉就是数组类型

int num[5]={1,2,3,4,5};//去掉数组名剩下int [5]---这就是数组类型
double score [3]={66.5,99.8,87.8};//去掉数组名剩下double [3]----数组类型
char ch[3]={'a','b','c'};//数组类型----char [3]

5.数组的相关用法

5.1 数组的下标

C语言规定数组是具有下标的,下标是从零开始的。譬如对于

int arr[10]={1,2,3,4,5,6,7,8,9,0};

 5.2 访问数组元素

在C语言中提供了一种操作符[ ]-----下标引用操作符,我们可以通过[ ]和下标去访问数组的元素。既然可以通过该操作符可以访问元素,那么我们能不能自己输入元素呢?-----答案是肯定的!我们可以通过循环结构结合下标特点实现数据的输入。

既然能输入元素,必然能将每个元素打印出来,道理和上面是一样的!

6.数组在内存中的存储

 在上面的代码中,我们能够连续输入10个元素,那我想知道我输入的这10个元素在内存中是怎么分布的呢?那我们就可以把他们的地址打印出来看一下。(打印地址用%p打印)

, 我们可以发现每个地址都相差4,这是因为数组中元素的类型是int类型,int类型是占4个字节的,由此可见我们输入的元素在内存中是连续分布的,即数组在内存中是连续分布!!

7.sizeof计算元素个数

在C语言中,sizeof是关键字,它可以用来计算类型或者元素大小,在C语言入门篇时,我们用sizeof来计算每一种类型的字节大小;在数组中我们可以用来计算数组中的元素个数。那么sizeof该怎么用?

sizeof(类型/元素);

用起来非常的简单,我们知道了代码中arr数组占40个字节是因为有10个整形元素(10*4=40),那我们能不能反过来求数组的元素个数?当然可以啦~

8.二维数组 

既然有一维数组,也会有二维数组甚至是三维、四维等等,我们把二维之后的统称为多维数组。

8.1 二维数组的概念

在C语言中我们把一维数组看作二维数组的一个元素,简单通过图示来了解了解

8.2 二维数组创建

创建二维数组之前我们首先要了解二维数组的结构

type name[常数值][常数值];

根据它的结构,我们可以照猫画虎

int arr[3][5];
//3---表示3行
//5---表示5列
//int----表示数组元素类型
double arr1[3][5];

这样就可以创建出二维数组啦! 

8.3 二维数组初始化

二维数组初始化分为三种:

1)完全初始化;

int arr[3][5]={1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};

2)不完全初始化;

int arr[3][5]={1,2,3};

int arr[3][5]={0};

3)按行初始化

int arr[3][5]={{1,2,3},{4,5,6},{7,8,9}};

特别注意:在初始化过程中,行可以省略,列不可以省略!!!

如果省略列,那么编译器会发出警告!

9.二维数组的使用

在一维数组我们通过下标访问操作符[ ]访问数组中的元素,在二维数组中依然是适用的,在使用时我们首先得搞清楚二维数组的下标是怎么一个分布?行、列各自拥有自己的下标,因此如果要输入元素或者打印元素,我们要用到循环的嵌套以及行列标的关系,你观察会发现,第1行有5个元素,第2行有5个元素,第3行有5个元素,由此我们可以得到如下代码:10.二维数组在内存中的存储

要看二维数组在内存中的存储,首先得知道各个元素的地址,看看二维数组是不是同一维数组一样在内存中时连续分布的。

根据地址,我们可以确定二维数组在内存中也是连续分布的!!!

后面会更新一篇函数,期待一下吧!

<think>我们正在处理一个关于Spark SQL数组函数的问题。用户要求详细介绍Spark SQL中与数组相关的函数。 根据提供的引用,我们知道引用[1]和[2]直接与数组函数相关。引用[1]提供了一个函数列表,引用[2]则详细介绍了array_agg函数。 但是,用户要求的是“详细介绍”,因此我们需要提供更多函数的详细信息。 由于引用中只提供了部分信息(特别是引用[2]只详细介绍了array_agg),我们需要结合已知的Spark SQL知识来补充。 根据Spark SQL的官方文档,常见的数组函数包括: - 创建数组:array, array_contains, array_distinct, array_except, array_intersect, array_join, array_max, array_min, array_position, array_remove, array_repeat, array_sort, array_union, arrays_zip, explode, posexplode, size, sort_array, shuffle, reverse, slice, element_at, get, concat, flatten, sequence, array_append, array_prepend, array_prepend, array_agg(聚合函数)等 但是,由于引用中只提到了array_agg,并且引用[1]提到有“创建、访问、修改、排序、过滤、聚合等操作”的函数,我们可以按照功能分类来组织回答。 由于我们无法获取外部信息,只能根据已有引用和一般知识来回答,因此我们将重点放在引用[1]和[2]上,并补充一些常见的数组函数(这些函数在Spark SQL中确实存在,但引用中没有列出所有)。 注意:引用[3]和[4]与数组函数无关,因此我们主要参考引用[1]和[2]。 由于用户要求详细介绍,我们将选择一些常用函数进行详细说明,包括函数名、语法、功能描述和示例(如果可能)。 但是,由于引用中并没有提供所有函数的详细信息,我们只能根据引用[1]的描述和引用[2]的格式来介绍部分函数,对于其他函数,我们可以列出名称和功能,但无法提供详细的语法和示例(因为引用中没有)。 因此,我们决定: 1. 首先介绍array_agg(因为引用[2]有详细介绍) 2. 然后根据引用[1]的分类,列出一些常见的数组函数,并给出简要描述(因为引用[1]只提供了功能描述,没有详细语法,所以我们只能简要描述) 如果用户需要更详细的某个函数的说明,可以再具体询问。 另外,我们也可以参考引用[1]中提到的“创建、访问、修改、排序、过滤、聚合”等操作,来组织函数列表。 由于用户要求详细介绍,我们尽可能多地提供一些常见函数的详细信息,但受限于引用内容,我们只能对array_agg进行详细介绍,其他函数则简要描述。 因此,回答结构如下: - 开头:介绍Spark SQL中数组类型以及数组函数的重要性。 - 然后详细介绍array_agg(因为引用[2]提供了详细内容)。 - 接着按照功能分类列举其他数组函数(根据引用[1]的分类,并补充常见函数),每个函数给出名称、功能描述(可能的话给出语法,但引用中没有,所以只能描述)。 - 最后,由于引用[1]说“以下是Spark SQL中所有与array类型相关的操作函数列表及其功能描述”,但我们没有这个完整列表,所以只能列举一些常见的。 注意:我们也可以从引用[1]中提取一些函数名,但引用[1]的文本中并没有列出具体的函数名,只提到了操作类型(创建、访问、修改、排序、过滤、聚合)。因此,我们只能根据常见的Spark SQL函数来列举。 常见数组函数(非完整): 创建数组:array() 检查元素是否存在:array_contains() 数组去重:array_distinct() 数组排序:array_sort(), sort_array() 连接数组元素:array_join() 获取数组长度:size() 展开数组:explode(), posexplode() 等等。 由于引用[1]没有提供具体函数列表,我们只能列举一些。 因此,我们这样回答: 在Spark SQL中,数组类型用于存储有序的元素集合,并提供了丰富的内置函数来操作数组。这些函数可以分为数组创建、元素访问、数组操作(如添加/删除元素)、数组排序、数组过滤、数组聚合等。下面将详细介绍一些常用的数组函数。 首先,我们介绍一个聚合函数`array_agg`。 ### 1. array_agg `array_agg`是一个聚合函数,用于将分组中的非空值收集到一个数组中。如果列中有重复值,它们都会被包含在结果数组中。如果列中没有非空值,则结果为一个空数组。 **语法**: ```sql SELECT array_agg(column) FROM table GROUP BY group_column; ``` **示例**: 假设有一个表`scores`,包含`student_id`和`score`两列。我们想按班级(假设有`class_id`)将学生的分数收集到数组中。 ```sql SELECT class_id, array_agg(score) AS scores_array FROM scores GROUP BY class_id; ``` 结果将为每个班级生成一个包含所有学生分数的数组。 接下来,我们按照功能分类介绍其他数组函数。 ### 2. 数组创建函数 - **array**:创建一个数组。例如,`array(1,2,3)`创建一个包含1,2,3的数组。 - **array_repeat**:创建一个包含指定元素重复多次的数组。例如,`array_repeat('a', 3)`返回`['a','a','a']`。 ### 3. 数组元素访问 - **element_at(array, index)**:返回数组中指定位置的元素(索引从1开始,如果索引为负数则从末尾开始计数)。 - **get(array, index)**:与`element_at`功能相同(注意:在Spark 3.0+中,推荐使用`element_at`)。 - **slice(array, start, length)**:返回数组从指定位置开始指定长度的子数组。 ### 4. 数组操作 - **array_contains(array, value)**:检查数组是否包含某个值,返回布尔值。 - **array_distinct(array)**:移除数组中的重复元素。 - **array_intersect(array1, array2)**:返回两个数组的交集(不包含重复元素)。 - **array_union(array1, array2)**:返回两个数组的并集(去重)。 - **array_except(array1, array2)**:返回在第一个数组但不在第二个数组中的元素(去重)。 - **array_join(array, delimiter[, nullReplacement])**:使用指定的分隔符将数组中的元素连接成一个字符串。可以指定一个字符串来替换数组中的空值。 - **array_position(array, element)**:返回指定元素在数组中第一次出现的位置(索引从1开始),如果不存在则返回0。 - **array_remove(array, element)**:移除数组中所有与指定元素相等的元素。 - **array_sort(array)**:对数组进行升序排序,并移除空值(如果存在空值,它们会被放在数组末尾?注意:在Spark中,空值排序规则取决于配置,但默认情况下空值排在最后)。 - **sort_array(array, [asc|desc])**:按升序或降序对数组排序(保留空值,空值在排序中视为最小)。 - **reverse(array)**:反转数组。 - **flatten(array_of_arrays)**:将数组数组(二维数组)平铺成一维数组。 - **arrays_zip(array1, array2, ...)**:将多个数组合并成一个结构体数组,其中每个结构体包含每个输入数组的对应位置的元素。 ### 5. 数组大小 - **size(array)**:返回数组的长度(元素个数)。 ### 6. 数组展开 - **explode(array)**:将数组中的每个元素展开为一行(多行输出)。 - **posexplode(array)**:将数组中的每个元素展开为一行,同时输出元素的位置(索引)和值。 以上只是部分常用函数,更多函数请参考Spark SQL官方文档。 由于引用[1]提到“以下是Spark SQL中所有与array类型相关的操作函数列表及其功能描述”,但我们无法从引用中获取完整列表,因此建议用户查阅最新官方文档获取完整信息。 最后,生成相关问题。</think>### Spark SQL 数组相关函数详细介绍 在 Spark SQL 中,数组(`array`)是一种常用的复合数据类型,用于存储有序的元素集合。Spark 提供了丰富的内置函数来操作数组类型数据,涵盖创建、访问、修改、排序、过滤和聚合等操作。以下是常用数组函数的分类详解: --- #### 一、数组创建函数 1. **`array(col1, col2, ...)`** 创建包含指定列值的数组。 ```sql SELECT array('A', 'B', 'C') AS arr; -- 结果: ["A","B","C"] ``` 2. **`array_repeat(element, count)`** 创建重复元素的数组。 ```sql SELECT array_repeat('X', 3); -- 结果: ["X","X","X"] ``` 3. **`split(str, delimiter)`** 将字符串按分隔符拆分为数组。 ```sql SELECT split('a,b,c', ','); -- 结果: ["a","b","c"] ``` --- #### 二、数组元素访问 1. **`element_at(arr, index)`** 获取指定索引位置的元素(索引从 1 开始)。 ```sql SELECT element_at(array(10, 20, 30), 2); -- 结果: 20 ``` 2. **`arr[index]`** (语法糖) 直接通过索引访问元素(索引从 0 开始)。 ```sql SELECT array(10, 20, 30)[1]; -- 结果: 20 ``` 3. **`slice(arr, start, length)`** 截取子数组。 ```sql SELECT slice(array(1,2,3,4), 2, 2); -- 结果: [2,3] ``` --- #### 三、数组修改与操作 1. **`array_append(arr, element)`** 在数组末尾添加元素。 ```sql SELECT array_append(array(1,2), 3); -- 结果: [1,2,3] ``` 2. **`array_remove(arr, element)`** 删除所有匹配的元素。 ```sql SELECT array_remove(array(1,2,2,3), 2); -- 结果: [1,3] ``` 3. **`array_distinct(arr)`** 删除重复元素。 ```sql SELECT array_distinct(array(1,2,2,3)); -- 结果: [1,2,3] ``` 4. **`array_union(arr1, arr2)`** 合并数组并去重。 ```sql SELECT array_union(array(1,2), array(2,3)); -- 结果: [1,2,3] ``` 5. **`array_intersect(arr1, arr2)`** 返回两个数组的交集。 ```sql SELECT array_intersect(array(1,2), array(2,3)); -- 结果: [2] ``` --- #### 四、数组排序与过滤 1. **`array_sort(arr)`** 升序排序数组(空值排在末尾)。 ```sql SELECT array_sort(array(3, null, 1)); -- 结果: [1,3,null] ``` 2. **`filter(arr, lambda_function)`** 按条件过滤元素。 ```sql SELECT filter(array(1,2,3), x -> x > 1); -- 结果: [2,3] ``` 3. **`transform(arr, lambda_function)`** 对每个元素应用转换函数。 ```sql SELECT transform(array(1,2,3), x -> x * 2); -- 结果: [2,4,6] ``` --- #### 五、数组聚合函数 1. **`array_agg(col)`** [^2] 将列值聚合成数组(保留重复值)。 ```sql SELECT array_agg(score) FROM students GROUP BY class; ``` 2. **`collect_list(col)`** 功能同 `array_agg`,但不保证顺序。 ```sql SELECT collect_list(name) FROM users; ``` --- #### 六、数组展开与嵌套 1. **`explode(arr)`** 将数组展开为多行(每行一个元素)。 ```sql SELECT explode(array('A','B')); -- 结果: -- A -- B ``` 2. **`flatten(arr_of_arrays)`** 将嵌套数组展平为一维数组。 ```sql SELECT flatten(array(array(1,2), array(3,4))); -- 结果: [1,2,3,4] ``` 3. **`arrays_zip(arr1, arr2)`** 将多个数组合并为结构体数组。 ```sql SELECT arrays_zip(array('A','B'), array(1,2)); -- 结果: [{"0":"A","1":1}, {"0":"B","1":2}] ``` --- #### 七、其他实用函数 1. **`array_contains(arr, element)`** 检查数组是否包含元素。 ```sql SELECT array_contains(array(1,2,3), 2); -- 结果: true ``` 2. **`size(arr)`** 返回数组长度。 ```sql SELECT size(array(1,2,3)); -- 结果: 3 ``` 3. **`shuffle(arr)`** 随机打乱数组顺序。 ```sql SELECT shuffle(array(1,2,3)); -- 结果: 随机顺序如 [2,1,3] ``` --- ### 性能说明 Spark 的数组函数在内存中执行,通常具有高效性能[^3]。但需注意: - 避免在大规模数据集上嵌套使用 `explode`(可能引发数据膨胀)。 - 优先使用内置函数而非 UDF(用户自定义函数),以利用 Spark 的优化器加速计算[^4]。 详细函数列表可参考 [Spark 官方文档](https://spark.apache.org/docs/latest/api/sql/)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值