Tableau + Spark SQL 连接器 + Java Spark 数据帧
Posted
技术标签:
【中文标题】Tableau + Spark SQL 连接器 + Java Spark 数据帧【英文标题】:Tableau + Spark SQL Connector + Java Spark Data Frames 【发布时间】:2018-07-25 13:38:01 【问题描述】:我需要使用 Tableau 对一些数据执行 BI 分析。数据存储在 Cassandra 数据库中,里面有一列是动态 JSON 数据,Tableau 无法直接解析。
Spark 作业将使用 Java 运行,连接到 Cassandra 数据库,因此执行所需的计算以将每个 JSON 类型映射到将要存储的新表。
我已经成功启动了一个 thrift-server 并使用 Tableau 连接到它,这里没问题
问题:虽然我确实存储了表,并且能够在 Java 输出控制台中看到它们,但在连接到 Thrift Server 的 Tableau 上查找它们时,我实际上看不到创建的表。
经过一番阅读,我设法发现 Thrift Server 和这些 Spark 作业都需要连接到同一个远程配置单元,但我似乎找不到我必须申请这些的设置。发生这种情况是因为 thrift-server shell 脚本是在一个上下文中执行的,而 Java 代码是在另一个(尽管在同一台机器上)执行的,所以我猜 HDFS 目录是不同的。
一些代码:
public static void main(String[] args)
SparkConf config = new SparkConf()
.setMaster("spark://Andres-MacBook-Air.local:7077")
.set("spark.sql.warehouse.dir", "/tmp/spark-tests")
.setAppName("tests");
SparkContext ctx = new SparkContext(config);
SparkSession session = new SparkSession(ctx);
SQLContext sqlCtx = new SQLContext(session);
Dataset<Row> emptyDataSet = session.createDataFrame(new ArrayList<>(), getSchema());
emptyDataSet.show();
sqlCtx.registerDataFrameAsTable(emptyDataSet, "tests");
emptyDataSet.cache();
System.out.println("*******");
Dataset<Row> row = sqlCtx.sql("SHOW TABLES IN `default`");
row.show();
while (true)
private static StructType getSchema()
String schemaString = "column1 column2 column3 column4 column5";
List<StructField> fields = new ArrayList<>();
StructField indexField = DataTypes.createStructField("column0", DataTypes.LongType, true);
fields.add(indexField);
for (String fieldName : schemaString.split(" "))
StructField field = DataTypes.createStructField(fieldName, DataTypes.StringType, true);
fields.add(field);
StructType schema = DataTypes.createStructType(fields);
return schema;
spark-thrift 服务器连接到同一个 spark master,我发出以下命令来启动它:
sbin/start-thriftserver.sh --master spark://Andres-MacBook-Air.local:7077 --conf spark.sql.warehouse.dir=/tmp/spark-tests --hiveconf hive.server2.thrift.port=10000
以下是我在 Maven 项目中使用的以下依赖项:
<dependencies>
<!-- Apache Spark -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.2.1</version>
</dependency>
<!-- Spark - Cassandra connector -->
<dependency>
<groupId>com.datastax.spark</groupId>
<artifactId>spark-cassandra-connector_2.11</artifactId>
<version>2.0.6</version>
</dependency>
</dependencies>
我正在使用 OSX 并在本地运行 spark:spark-2.2.1-bin-hadoop2.7
提前致谢。
【问题讨论】:
【参考方案1】:获取一个 mysql db(端口 3306),启动 hive Metastore 进程(端口 9083),启动 hiveserver2 进程(端口 10000)然后将 hive-site.xml 从 hive 文件夹复制到 spark 文件夹并启动 spark thrift 服务器进程(端口10002)。需要 mysql 来存储 hive 表的元数据(模式/表/列名、数据类型、分区)。
这些链接可以提供帮助:
https://mapr.com/docs/52/Spark/SparkSQLThriftServer.html https://www.cloudera.com/documentation/enterprise/5-6-x/topics/cdh_ig_hive_metastore_configure.html https://heshamrafi.wordpress.com/2017/08/16/install-hive-and-configure-mysql-for-metadata/ https://www.guru99.com/installation-configuration-hive-mysql.html https://developer.ibm.com/hadoop/2016/08/22/how-to-run-queries-on-spark-sql-using-jdbc-via-thrift-server/
【讨论】:
以上是关于Tableau + Spark SQL 连接器 + Java Spark 数据帧的主要内容,如果未能解决你的问题,请参考以下文章