使用python将Spark 2与HBase集成连接起来的罐子

时间:2018-01-12 05:18:33

标签: python pyspark hbase apache-spark-2.0

我在Spark 2中使用pyspark,是否有任何jar可以将HBasepyspark连接起来。

请帮我提供示例代码。

2 个答案:

答案 0 :(得分:1)

您可以访问此link以查看Spark中可用的连接器。

有关此link的更多信息。阅读Readme.md了解详细信息。

以下是您必须添加的依赖项。

您只需在sbt中添加以下依赖项:

libraryDependencies += "it.nerdammer.bigdata" % "spark-hbase-connector_2.10" % "1.0.3"

依赖的Maven样式版本是:

<dependency>
  <groupId>it.nerdammer.bigdata</groupId>
  <artifactId>spark-hbase-connector_2.10</artifactId>
  <version>1.0.3</version>
</dependency>

示例代码:

val sparkConf = new SparkConf()
...
sparkConf.set("spark.hbase.host", "thehost")
...
val sc = new SparkContext(sparkConf)

写入HBase(基础)

写HBase很容易。请记住导入隐式转换:

import it.nerdammer.spark.hbase._

您只需要创建一个示例RDD,如下所示:

val rdd = sc.parallelize(1 to 100)
            .map(i => (i.toString, i+1, "Hello"))

这个rdd由元组组成(&#34; 1&#34;,2,&#34; Hello&#34;)或(&#34; 27&#34;,28,&#34; Hello&# 34)。每个元组的第一个元素被认为是行id,其他元素将被分配给列。

rdd.toHBaseTable("mytable")
    .toColumns("column1", "column2")
    .inColumnFamily("mycf")
    .save()

你完成了。 HBase现在在表mytable中包含100行,每行包含列mycf:column1和mycf:column2的两个值。

从HBase(基础)读取

从HBase读取更容易。请记住导入隐式转换:

import it.nerdammer.spark.hbase._

如果您想阅读上一个例子中写的数据,您只需要写:

val hBaseRDD = sc.hbaseTable[(String, Int, String)]("mytable")
    .select("column1", "column2")
    .inColumnFamily("mycf")

希望,这有帮助。

答案 1 :(得分:1)

作为之前答案的替代方案:

我正在使用hortonworks spark hbase连接器。您可以在github找到它。他们在spark summit上引入了连接器。在演讲结束时,还有一个带有一些示例代码的现场演示。希望,它有所帮助。

---编辑---

示例中的代码是用scala编写的,但连接器也适用于pyspark。这是一个写/读示例:

使用连接器启动PySpark-Shell(也许您必须使用其他版本的软件包进行设置 - 查看github上的介绍和对话)。

pyspark --master yarn --packages com.hortonworks.shc:shc-core:1.1.0.2.6.5.2-8 --repositories http://nexus-private.hortonworks.com/nexus/content/groups/public/

创建一个sql-context并定义数据

sqlc = SQLContext(sc)
data_source_format = 'org.apache.spark.sql.execution.datasources.hbase'

接下来,我们必须定义一个目录,它是连接器可读的表结构。当您可以访问hbase的默认命名空间时,请使用默认值替换YourNameSpace。如果没有,请插入可访问的命名空间。

catalog = ''.join("""{
    "table":{"namespace":"YourNameSpace", "name":"TestTable", "tableCoder":"PrimitiveType"},
    "rowkey":"key",
    "columns":{
        "ID":{"cf":"rowkey", "col":"key", "type":"string"},
        "DATA":{"cf":"data", "col":"", "type":"string"}
        }
    }""".split())

要创建一个hbase表并在其中写入内容,我们会创建一个包含一些数据的合适数据帧......

df = sc.parallelize([('1', 'Moin'), ('2', 'Hello'), ('3', 'Hallo')]).toDF(schema=['ID', 'DATA'])

...并将其保存到hbase。

df.write.options(catalog=catalog, newtable = 5).format(data_source_format).save()

现在我们可以从hbase表中读取内容并将其保存到变量中:

df_read = sqlc.read.options(catalog=catalog).format(data_source_format).load()

检查:

>>> df_read.show()
+---+-----+                                                                     
| ID| DATA|
+---+-----+
|  1| Moin|
|  2|Hello|
|  3|Hallo|
+---+-----+

- 在HDP 2.5上使用PySpark 2进行测试