SparkSQL之External Data读写parquet

本文详细介绍如何在Spark中操作Parquet文件,包括读取、查询、转换及使用Spark-SQL进行数据处理的方法。

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

准备数据文件

/home/iie4bu/app/spark-2.4.5-bin-2.6.0-cdh5.15.1/examples/src/main/resources路径下有一个users.parquet文件。

查看parquet文件内容

package cn.ac.iie.spark

import org.apache.spark.sql.SparkSession

/**
 * Parquet文件操作
 */
object ParquetApp {
  def main(args: Array[String]): Unit = {
    val sparksession = SparkSession.builder().appName("DataFrameCase").master("local[2]").getOrCreate()
    val df = sparksession.read.format("parquet").load("file:///E:/test/users.parquet")
    df.printSchema()
    df.show()
    sparksession.close()
  }
}

我们先简单打印一下users.parquet文件内容是什么,输出结果如下:
在这里插入图片描述
在这里插入图片描述

简单查询然后将结果输出

object ParquetApp {
  def main(args: Array[String]): Unit = {
    val sparksession = SparkSession.builder().appName("DataFrameCase").master("local[2]").getOrCreate()
    val df = sparksession.read.format("parquet").load("file:///E:/test/users.parquet")
    df.printSchema()
    df.show()
    df.select("name", "favorite_numbers").write.format("json").save("file:///E:/test/users-result")
    sparksession.close()
  }
}

这样就将结果保存到E:/test/users-result文件夹下了。

spark数据源如果没有指定format,那么默认是parquet文件来处理。

val df2 = sparksession.read.load("file:///E:/test/users.json")会报错,因为spark会默认是parquet文件格式。

使用Spark-SQL方式读取parquet文件

启动spark-sql:./spark-sql --master local[2] --jars /home/iie4bu/software/mysql-connector-java-5.1.35.jar --driver-class-path /home/iie4bu/software/mysql-connector-java-5.1.35.jar

CREATE TEMPORARY VIEW parquetTable
USING org.apache.spark.sql.parquet
OPTIONS (
  path "/home/iie4bu/app/spark-2.4.5-bin-2.6.0-cdh5.15.1/examples/src/main/resources/users.parquet"
)

查看刚创建的表:show tables
在这里插入图片描述
查询表内容:select * from parquettable
在这里插入图片描述

可以通过option方式导入数据

sparksession.read.format("parquet").option("path", "file:///E:/test/users.parquet").load(),这种方式与上面的方式效果是相同的。

<think>好的,用户遇到了Hive创建外部表时出现ParseException错误,具体是'LOCATION' EOF错误。我需要仔细分析可能的原因和解决方案。 首先,用户提供的错误信息是“ParseException 'LOCATION' EOF error”,这通常意味着在解析CREATE EXTERNAL TABLE语句时,Hive在LOCATION子句的位置遇到了意外的结束。可能的情况是语法错误,比如括号不匹配、缺少逗号或关键字顺序错误。 接下来,我需要回忆Hive创建外部表的标准语法。正确的语法结构应该是: CREATE EXTERNAL TABLE 表名 (列定义) ROW FORMAT ... STORED AS ... LOCATION '路径'; 用户可能在编写语句时遗漏了某些必要的子句,例如在LOCATION之前缺少STORED AS或者ROW FORMAT。比如,如果在指定LOCATION之前没有正确结束前面的子句,比如STORED AS TEXTFILE,Hive可能会认为语句提前结束,导致解析错误。 另外,用户提供的引用内容中有关于HBase配置的信息,这可能与Hive外部表的位置配置有关。例如,Hive外部表的LOCATION需要指向HDFS的正确路径,确保路径格式正确,比如hdfs://namenode:port/path。如果路径格式错误,或者HDFS服务未正确配置,也可能导致问题,但根据错误信息来看,更可能是语法问题。 常见的错误案例可能包括: 1. LOCATION子句的位置不正确,比如在ROW FORMAT之前。 2. 缺少STORED AS子句,导致解析器在LOCATION处遇到意外结束。 3. 括号或引号不匹配,例如字符串未正确闭合。 解决方案需要逐步检查语法结构,确保各个子句的顺序正确,并且所有必要的部分都存在。例如,用户可能需要确认在LOCATION之前是否已经正确指定了STORED AS文件格式,并且所有逗号和括号都正确闭合。 另外,用户可能需要检查HDFS路径是否存在,以及权限是否正确。虽然权限问题通常会导致不同的错误,但确保路径正确也是排除问题的一部分。 最后,根据用户提供的引用,特别是引用[2]中的HBase配置示例,可能需要确认Hive的元数据存储和HDFS配置是否正确,但主要问题还是集中在SQL语法上。</think>### Hive外部表创建时ParseException 'LOCATION' EOF错误解决方案 该错误通常由**SQL语法顺序错误**或**关键子句缺失**导致。以下是具体排查步骤: --- #### 1. 验证基础语法结构 Hive创建外部表的完整语法模板: ```sql CREATE EXTERNAL TABLE [IF NOT EXISTS] 表名 ( 列名1 数据类型, 列名2 数据类型, ... ) [COMMENT '表注释'] ROW FORMAT SERDE '序列化类' [WITH SERDEPROPERTIES (属性名=属性值,...)] STORED AS 文件格式 LOCATION 'hdfs路径' ``` **关键顺序要求**:`LOCATION`必须是最后一个子句,且必须位于`STORED AS`之后[^1]。 **错误示例**: ```sql CREATE EXTERNAL TABLE test ( id INT ) LOCATION '/user/hive/test' -- 错误!缺少STORED AS子句 STORED AS PARQUET; ``` 此时Hive解析器会在`LOCATION`处提前终止解析,触发EOF错误。 --- #### 2. 检查关键子句完整性 以下子句必须存在且顺序正确: - **必选**:`ROW FORMAT`或`STORED AS` - **必选**:`LOCATION` **正确示例**: ```sql CREATE EXTERNAL TABLE logs ( timestamp STRING, message STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE LOCATION 'hdfs://namenode:8020/user/hive/logs'; ``` --- #### 3. 特殊场景处理 **场景1:使用HBase集成** 若外部表关联HBase,需确保: - 指定`STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'` - 声明`WITH SERDEPROPERTIES`和`TBLPROPERTIES` **示例**: ```sql CREATE EXTERNAL TABLE hbase_table ( key STRING, value STRING ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ( 'hbase.columns.mapping' = ':key,cf:val' ) TBLPROPERTIES ('hbase.table.name' = 'hbase_namespace:table_name') LOCATION 'hdfs:///hbase/data/hbase_namespace/table_name'; -- 路径需匹配HBase根目录配置[^2] ``` **场景2:使用自定义文件格式** 若使用ORC/Parquet等格式,需明确声明: ```sql CREATE EXTERNAL TABLE user_actions ( user_id BIGINT, action STRING ) STORED AS ORC LOCATION 'hdfs://cluster/data/user_actions'; ``` --- #### 4. 验证HDFS路径有效性 执行HDFS命令检查路径: ```bash hdfs dfs -ls hdfs://namenode:8020/path/to/table ``` 需确保: - 路径存在且格式正确 - Hive服务有读写权限 - 与`hbase.rootdir`等配置无冲突(若涉及HBase集成)[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值