我正在使用Apache Spark 2.1.1,我在$SPARK_HOME/conf文件夹中放了以下hive-site.xml :
<?xml version="1.0"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://mysql_server:3306/hive_metastore?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>password</value>
<description>password to use against metastore database</description>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
<description>password to use against metastore database</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>${test.tmp.dir}/hadoop-tmp</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>hdfs://hadoop_namenode:9000/value_iq/hive_warehouse/</value>
<description>Warehouse Location</description>
</property>
</configuration>
Run Code Online (Sandbox Code Playgroud)
当我启动thrift服务器时,我的MySQL数据库上创建了Metastore模式但未使用,而是使用了Derby.
在thrift服务器日志文件中找不到任何错误,唯一引起我注意的是它尝试在first( …
我有以下代码:
dataset
.distinct()
.repartition(400)
.persist(StorageLevel.MEMORY_ONLY())
.createOrReplaceTempView("temp");
sqlContext.sql("select * from temp");
Run Code Online (Sandbox Code Playgroud)
这只是一个例子,我需要对同一个实体执行大约 100 个查询,这就是我坚持它的原因。我以为当我查询时temp它会查询缓存的实体,但是当我检查 spark ui 查询详细信息时,我看到每个查询都执行了重新分区temp,因此查询数据集并为每个查询执行 DAG。
- - - - - - - - - 编辑 - - - - - - - - - - - -
这里查询的图表和逻辑计划,对我来说是一样的,我的期望是对于第一个查询执行所有必需的步骤,然后它将直接访问内存中的视图。
我已检查sqlContext.isCached("temp")并打印true。
查询执行图
第一个查询计划
== Parsed Logical Plan ==
'Project [11 AS tenant_id#4958, cube_purchase_details AS cube_name#4959, purchase_activity AS field#4960, 'purchase_activity AS value#4961]
+- 'UnresolvedRelation `filter_temp`
== Analyzed Logical Plan ==
tenant_id: string, cube_name: …Run Code Online (Sandbox Code Playgroud) 我在独立模式下有一个Apache Spark集群(2.2.0)。直到现在使用HDFS来运行镶木地板文件。我正在使用Apache Hive 1.2的Hive Metastore Service通过Thriftserver通过JDBC访问Spark。
现在,我想使用S3对象存储而不是HDFS。我在hive-site.xml中添加了以下配置:
<property>
<name>fs.s3a.access.key</name>
<value>access_key</value>
<description>Profitbricks Access Key</description>
</property>
<property>
<name>fs.s3a.secret.key</name>
<value>secret_key</value>
<description>Profitbricks Secret Key</description>
</property>
<property>
<name>fs.s3a.endpoint</name>
<value>s3-de-central.profitbricks.com</value>
<description>ProfitBricks S3 Object Storage Endpoint</description>
</property>
<property>
<name>fs.s3a.endpoint.http.port</name>
<value>80</value>
<description>ProfitBricks S3 Object Storage Endpoint HTTP Port</description>
</property>
<property>
<name>fs.s3a.endpoint.https.port</name>
<value>443</value>
<description>ProfitBricks S3 Object Storage Endpoint HTTPS Port</description>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>s3a://dev.spark.my_bucket/parquet/</value>
<description>Profitbricks S3 Object Storage Hive Warehouse Location</description>
</property>
Run Code Online (Sandbox Code Playgroud)
我在MySQL 5.7数据库中有配置单元metastore。我已将以下jar文件添加到Hive lib文件夹中:
我已经在MySQL上删除了旧的配置单元metastore模式,然后使用以下命令启动了metastore服务:hive --service metastore &并且出现以下错误:
java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper
at com.amazonaws.util.json.Jackson.<clinit>(Jackson.java:27)
at com.amazonaws.internal.config.InternalConfig.loadfrom(InternalConfig.java:182) …Run Code Online (Sandbox Code Playgroud) 我想从另一个数据库中创建一个数据集,但仅使用某些特定的列,并且我想使用该dataset.select()功能,而不是创建一个从该数据集中选择所需列的动态SQL查询。
我发现使用JavaConversions.asScalaBuffer(asList(new Column("value1"), new Column("value2")))I可以创建一个,Set<Column>但是如何动态创建呢?因为我已经尝试过了
List<Column> filterColumns = new ArrayList<>();
for (ColumnMetadata field : fields) {
filterColumns.add(new Column(field.getFieldName()));
}
dataset.select(JavaConversions.asScalaBuffer(asList(filterColumns)))
Run Code Online (Sandbox Code Playgroud)
但这不起作用,编译器说 no suitable method found for select(Buffer<List<Column>>)