我正在研究 AWS 上的 Hive(特别是 EMR)。他们提供了两种选择
hive命令行客户端提供 Hive 查询。显然,在第二个选项中,集群将保持活动状态,直到明确要求终止为止。
我想修改保持活动配置单元集群中从属节点的数量。我在emr faq中读到它只支持添加和删除,task-nodes但仅支持添加(但不删除)core-nodes。核心节点有助于 HDFS 存储,但任务节点则不然。
我想向正在运行的集群添加更多核心节点,并在运行的查询数量较少时缩小它们的规模。有没有办法实现这一点(可能使用cloudwatch)?
我想找出表中每一列的数据类型?
例如,假设我的表是使用以下命令创建的:
create table X
(
col1 string,
col2 int,
col3 int
)
Run Code Online (Sandbox Code Playgroud)
我想做一个会输出如下内容的命令:
column datatype
col1 string
col2 int
Run Code Online (Sandbox Code Playgroud)
有这个命令吗?最好是在 SparkSQL 中。但是,如果没有,那么如何使用其他方式获取这些数据呢?我正在使用 Spark sql 查询 Hive 表。也许通过 HIVE 中的元数据?谢谢。
尽管多年来一直使用传统数据库,但我相信我对 Hive 和 Impala 如何与 HDFS 交互(或者 HDFS 本身如何工作!)有一个根本的误解,并希望得到一些建议。
只是为了设定我的想法:在 Windows 上,当我创建一个文件(例如 bob.txt)时,该文件存储在“文件系统”(NTFS)上。现在,无论我使用 Windows 资源管理器、命令提示符还是其他软件,我都会看到 bob.txt,因为它存在于“文件系统”中,并且所有软件都可以访问文件系统。
在我使用 RedHat 上的 Cloudera 与 HDFS 的 noobie 交互中,我不相信它的工作方式与上一段所述完全相同。
例如,在使用 Hue 时,如果我在“Hive 查询编辑器”中创建一个表,则在“Impala 查询编辑器”中时,该表似乎没有显示在表列表下。当我从命令提示符使用“hive”和“impala-shell”时,也会发生类似的情况。但是,这对我来说没有意义,因为在这种情况下,表应该只是“在文件系统上”——HDFS。
使用 sqoop 从 Oracle 中提取时会发生类似的操作。当我从 Oracle 中提取的表应该放在“文件系统上”时,为什么我需要使用“--import-hive”选项。一旦在 HDFS 文件系统上,位于它之上的任何软件——例如 Hive、Impala 或其他任何东西——都应该能够访问它。
在任何情况下,其中一些可能是 noobie 用户错误/误解,所以预先道歉!
并提前感谢您的任何评论/建议!
drwxr-xr-x - mgupta supergroup 0 2018-03-26 22:16 /kylin/retailer/qi_basket_brand_bucket_fact/_impala_insert_staging
drwxr-xr-x - mgupta supergroup 0 2018-03-26 22:18 /kylin/retailer/qi_basket_brand_bucket_fact/product_hierarchy_type=CI
[mgupta@sjc-dev-binn01 ~]$ hadoop fs -ls /kylin/retailer/qi_basket_brand_bucket_fact/product_hierarchy_type=CI
Found 27 items
drwxr-xr-x - mgupta supergroup 0 2018-03-26 22:16 /kylin/retailer/qi_basket_brand_bucket_fact/product_hierarchy_type=CI/month_id=201601
drwxr-xr-x - mgupta supergroup 0 2018-03-26 22:16 /kylin/retailer/qi_basket_brand_bucket_fact/product_hierarchy_type=CI/month_id=201602
drwxr-xr-x - mgupta supergroup 0 2018-03-26 22:16 /kylin/retailer/qi_basket_brand_bucket_fact/product_hierarchy_type=CI/month_id=201603
drwxr-xr-x - mgupta supergroup 0 2018-03-26 22:16 /kylin/retailer/qi_basket_brand_bucket_fact/product_hierarchy_type=CI/month_id=201604
drwxr-xr-x - mgupta supergroup 0 2018-03-26 22:16 /kylin/retailer/qi_basket_brand_bucket_fact/product_hierarchy_type=CI/month_id=201605
drwxr-xr-x - mgupta supergroup 0 2018-03-26 22:16 /kylin/retailer/qi_basket_brand_bucket_fact/product_hierarchy_type=CI/month_id=201606
drwxr-xr-x - mgupta supergroup 0 2018-03-26 22:16 …Run Code Online (Sandbox Code Playgroud) 为了遍历从 Hive 表创建的 Spark Dataframe 的列并更新所有出现的所需列值,我尝试了以下代码。
import org.apache.spark.sql.{DataFrame}
import org.apache.spark.sql.functions._
import org.apache.spark.sql.functions.udf
val a: DataFrame = spark.sql(s"select * from default.table_a")
val column_names: Array[String] = a.columns
val required_columns: Array[String] = column_names.filter(name => name.endsWith("_date"))
val func = udf((value: String) => { if if (value == "XXXX" || value == "WWWW" || value == "TTTT") "NULL" else value } )
val b = {for (column: String <- required_columns) { a.withColumn(column , func(a(column))) } a}
Run Code Online (Sandbox Code Playgroud)
在 spark shell 中执行代码时,出现以下错误。
scala> val b = {for …Run Code Online (Sandbox Code Playgroud) 我有一些分区的配置单元表,它们指向镶木地板文件。现在每个分区都有很多小的镶木地板文件,每个大小约为 5kb,我想将这些小文件合并为每个分区的一个大文件。我怎样才能做到这一点来提高我的蜂巢性能?我尝试将分区中的所有镶木地板文件读取到 pyspark 数据帧,并将组合数据帧重写到同一分区并删除旧的。但出于某种原因,这对我来说似乎效率低下或初学者级别的类型。这样做的利弊是什么?而且,如果有任何其他方法,请指导我在 spark 或 pyspark 中实现它。
我正在尝试从 Spark Sql 将数据插入到 Hive 外部表中。我通过以下命令创建了 hive 外部表
CREATE EXTERNAL TABLE tab1 ( col1 type,col2 type ,col3 type) CLUSTERED BY (col1,col2) SORTED BY (col1) INTO 8 BUCKETS STORED AS PARQUET
Run Code Online (Sandbox Code Playgroud)
在我的 spark job 中,我编写了以下代码 Dataset df = session.read().option("header","true").csv(csvInput);
df.repartition(numBuckets, somecol)
.write()
.format("parquet")
.bucketBy(numBuckets,col1,col2)
.sortBy(col1)
.saveAsTable(hiveTableName);
Run Code Online (Sandbox Code Playgroud)
每次运行此代码时,都会出现以下异常
org.apache.spark.sql.AnalysisException: Table `tab1` already exists.;
at org.apache.spark.sql.DataFrameWriter.saveAsTable(DataFrameWriter.scala:408)
at org.apache.spark.sql.DataFrameWriter.saveAsTable(DataFrameWriter.scala:393)
at somepackage.Parquet_Read_WriteNew.writeToParquetHiveMetastore(Parquet_Read_WriteNew.java:100)
Run Code Online (Sandbox Code Playgroud) 在蜂巢中,我可以通过以下方式做到:
ALTER TABLE xxx ADD PARTITION (datehour='yy') LOCATION 'zz';
我怎样才能在 presto 中做到这一点?
下面是我的 Hive 表定义:
CREATE EXTERNAL TABLE IF NOT EXISTS default.test2(
id integer,
count integer
)
PARTITIONED BY (
fac STRING,
fiscaldate_str DATE )
STORED AS PARQUET
LOCATION 's3://<bucket name>/backup/test2';
Run Code Online (Sandbox Code Playgroud)
我有如下配置单元表中的数据,(我刚刚插入了示例数据)
select * from default.test2
+---+-----+----+--------------+
| id|count| fac|fiscaldate_str|
+---+-----+----+--------------+
| 2| 3| NRM| 2019-01-01|
| 1| 2| NRM| 2019-01-01|
| 2| 3| NRM| 2019-01-02|
| 1| 2| NRM| 2019-01-02|
| 2| 3| NRM| 2019-01-03|
| 1| 2| NRM| 2019-01-03|
| 2| 3|STST| 2019-01-01|
| 1| 2|STST| 2019-01-01|
| 2| 3|STST| …Run Code Online (Sandbox Code Playgroud) 我知道 Presto 以前是 PrestoDB,而 Trino 以前是 PrestoSQL。我知道 PrestoDB 于 2012 年在 Facebook 创建,直到 2019 年 1 月它们都是同一个项目。据我所知,该项目最初是为了解决 300 PB Hive 数据仓库上的缓慢查询而创建的。我知道还有来自 Teradata 的 Presto 发行版等等。
我从互联网上收集了一些信息,当我在寻找基于事实的差异时,这些信息非常有见地。
在比较两者并更喜欢 Trino的博客中,我看到他们说:
- 虽然 Trino 是针对多个数据源运行 ETL 查询的公司的出色解决方案,但它还提供了节省资源和收集更多输出的选项。
- Trino 还擅长允许用户使用 SQL 运行即席查询,而不管数据位于何处。它消除了将数据 ETL 到另一个系统的需要。
- Trino 允许用户创建个性化的报告和统一的仪表板,以更好地查询多个数据源。
以及 Trino 中不存在的 Presto 功能,例如 Presto-on-Spark 看起来一直是开发重点:
这些功能包括:
- Project Aria – 非常适合处理 ORC 等文件格式。
- Project Presto Unlimited – 一种用于创建临时内存存储桶的内存节省功能。
- 其他用户定义的函数,例如动态 SQL 函数支持。
- Presto-on-Spark – Spark 执行器中的库。
在Trino的公告中,他们展示了两个项目之间提交数量的差异。
另一个帖子,是喜欢普雷斯托 …
hive ×10
apache-spark ×5
presto ×2
pyspark ×2
amazon-emr ×1
autoscaling ×1
create-table ×1
filesystems ×1
hadoop ×1
hdfs ×1
impala ×1
parquet ×1
partition ×1
scala ×1
trino ×1