一些sparksql的面试题
1、sparkCore读取数据的方式
SparkCore 读取数据主要依靠 SparkContext 创建 RDD,具体方式有几种。
一是 textFile() 方法,最常用,用来读文本文件,比如从 HDFS 或本地系统读,按行处理。
二是 wholeTextFiles(),适合读取一堆小文件,它会返回(文件名, 文件内容)这种格式。
三是 sequenceFile(),专门用来读 Hadoop 的 SequenceFile 格式。
四是 parallelize(),主要用在测试里,把程序里的一个集合(比如 List)变成 RDD 来用。
所以总结来看,SparkCore 提供了从文件系统、Hadoop兼容系统以及内存集合创建 RDD 的多种途径。
2、sparkSQL读取数据的方式
SparkSQL 读取数据主要通过 SparkSession 的 read API,拿回来的是 DataFrame 或 Dataset。
核心方式是 read.format("格式").load("路径"),这里的格式可以是 json,csv,parquet,orc 这些。
为了方便,也提供了直接的方法,比如 read.json(),read.parquet()。
另外就是读关系型数据库,用 read.jdbc(),可以连 MySQL 这些;读 Hive 表直接用 spark.sql("select * from table") 或者 read.table("table_name")。
所以 SparkSQL 的读取方式更声明式,统一并且能利用 Catalyst 优化器。
3、hive中数据的来源
Hive 里的数据来源,我们主要分两部分看。
一是元数据,它存在像 MySQL 这样的独立数据库里,记录的是表结构、分区信息这些。
二是原始数据本身,对于内部表,数据默认存在 HDFS 的 /user/hive/warehouse 目录下;对于外部表,数据可以存在 HDFS、S3 等任何指定位置,Hive 只管理元数据。
数据怎么来的呢?主要是通过 LOAD DATA 命令把文件加载进去,或者通过 INSERT INTO 语句(背后可能是 MapReduce、Spark 引擎)计算产生,再就是建外部表时直接指向数据所在的已有位置。
所以,Hive 本身不产生数据,它主要管理和描述存储在别处的数据。
