.format("org.apache.phoenix.spark") vs .format("jdbc")

问题描述 投票:0回答:1

我想知道在加载 HBase 表(通过 Phoenix)到 Spark DataFrame 时使用

.format("org.apache.phoenix.spark")
与 .
format("jdbc")
有什么区别。

val tracesDF = spark.sqlContext.read
  .format("org.apache.phoenix.spark")
  .option("table", hbaseTblName)
  .option("zkUrl", appConf.getString("zookeeper_url"))

val tracesDF = spark.sqlContext.read
  .format("jdbc")
  .option("driver", "org.apache.phoenix.jdbc.PhoenixDriver")
  .option("url", appConf.getString("hbasedb_url"))

我发现与此问题相关的另一个问题:

  • 我通过jdbc语句创建HBase表
    hbaseCon.createStatement().execute('CREATE TABLE ...)
  • .format("org.apache.phoenix.spark") 
    的数据框为空,而
    .format("jdbc")
    正确返回数据
  • 使用 .format("org.apache.phoenix.spark") 时需要指定列族 [
    tracesDF.select(...,"``B.SAMPLES_BINARY``")
    ],但使用 .format("jdbc") 时不需要指定 [
    tracesDF.select(...,"SAMPLES_BINARY")
    ]
apache-spark apache-spark-sql hbase apache-phoenix
1个回答
0
投票

将 HBase 表(通过 Phoenix)加载到 Spark DataFrame 时使用 .format("org.apache.phoenix.spark").format("jdbc") 之间的区别在于特定的 Spark 数据源正在使用的实现。

使用.format(“org.apache.phoenix.spark”):

此格式特定于 Phoenix Spark 连接器。当您使用此格式时,您将利用 Phoenix Spark 连接器直接与 HBase 表进行交互。 Phoenix Spark 连接器针对从 Phoenix 表读取数据进行了优化,并且可以提供针对 Phoenix 用例定制的特定优化或功能。

Scala 中的示例:

val tracesDF = spark.sqlContext.read
  .format("org.apache.phoenix.spark")
  .option("table", hbaseTblName)
  .option("zkUrl", appConf.getString("zookeeper_url"))
  .load()

使用.format(“jdbc”):

此格式表示与 HBase 的通用 JDBC(Java 数据库连接)连接。它将HBase视为标准的JDBC数据源,并使用Phoenix JDBC驱动程序连接HBase表。 通用 JDBC 格式更加通用,可用于各种数据库,但它可能无法利用 Phoenix Spark 连接器提供的特定优化。

Scala 中的示例:

val tracesDF = spark.sqlContext.read
  .format("jdbc")
  .option("driver", "org.apache.phoenix.jdbc.PhoenixDriver")
  .option("url", appConf.getString("hbasedb_url"))
  .option("dbtable", hbaseTblName)
  .load()

关于需要以不同方式指定列族的问题,可能与Spark在使用不同格式时解释列名的方式有关。

使用 .format("org.apache.phoenix.spark") 时,如果列名包含大写字符或特殊字符,您可能需要使用双反引号(``)来指定列名。这是因为 Phoenix 列名称区分大小写,并且使用反引号可确保 Spark 正确解释列名称。

Scala 中的示例:

tracesDF.select(..., "`B.SAMPLES_BINARY`")

使用 .format("jdbc") 时,Spark 可能会以不同方式处理列名称,并且可能不需要反引号。这可能是由于 Phoenix 的 Spark 连接器处理列名称的方式有所不同。

总之,.format("org.apache.phoenix.spark").format("jdbc") 之间的选择取决于您的具体用例以及您是否想要利用 Phoenix 提供的优化火花连接器。此外,列命名约定的差异可能会受到每个连接器的底层实现细节的影响。

© www.soinside.com 2019 - 2024. All rights reserved.