如何改善每行连接到Hbase的DataFrame UDF

时间:2019-01-31 13:28:01

标签: apache-spark apache-spark-sql

我有一个DataFrame,我需要在其中基于每一行的值创建一列。 我使用UDF进行迭代,该处理针对每一行并连接到HBase以获取数据。

UDF创建一个连接,返回数据,关闭一个连接。

该过程很慢,因为几次读取后Zookeeper挂起。我只想通过1个打开的连接拉数据。

我尝试了mapwithpartition,但是由于未序列化连接而未通过。

UDF:-

val lookUpUDF = udf((partyID: Int, brand: String, algorithm: String, bigPartyProductMappingTableName: String, env: String) => lookUpLogic.lkpBigPartyAccount(partyID, brand, algorithm, bigPartyProductMappingTableName, env))

DataFrame的迭代方式:-

ocisPreferencesDF
      .withColumn("deleteStatus", lookUpUDF(col(StagingBatchConstants.OcisPreferencesPartyId),
        col(StagingBatchConstants.OcisPreferencesBrand), lit(EnvironmentConstants.digest_algorithm), lit
        (bigPartyProductMappingTableName), lit(env)))

主要登录名:-

def lkpBigPartyAccount(partyID: Int,
                         brand: String,
                         algorithm: String,
                         bigPartyProductMappingTableName: String,
                         envVar: String,
                         hbaseInteraction: HbaseInteraction = new HbaseInteraction,
                         digestGenerator: DigestGenerator = new DigestGenerator): Array[(String, String)] = {
    AppInit.setEnvVar(envVar)
    val message = partyID.toString + "-" + brand
    val rowKey = Base64.getEncoder.encodeToString(message.getBytes())
    val hbaseAccountInfo = hbaseInteraction.hbaseReader(bigPartyProductMappingTableName, rowKey, "cf").asScala
    val convertMap: mutable.HashMap[String, String] = new mutable.HashMap[String, String]
    for ((key, value) <- hbaseAccountInfo) {
      convertMap.put(key.toString, value.toString)
    }

    convertMap.toArray
  }

我希望提高代码性能。我希望只创建一次连接。

0 个答案:

没有答案