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 数据帧的主要内容,如果未能解决你的问题,请参考以下文章

tableau连接spark sql 报错,怎么处理?

无法创建数据提取 - Tableau 和 Spark SQL

寒假第十天

Tableau BigQuery 连接器 - SQL 方言

tableau怎么与sql连接

Tableau 与 Microsoft SQL Server 2017 的连接