可以将作为newAPIHadoopRDD加载的数据转换为DataFrame吗?

时间:2016-03-25 19:04:44

标签: python apache-spark google-bigquery pyspark

我使用PySpark从Google BigQuery加载数据。

我使用以下方式加载数据:

row = Row(['userId','accoId','rating']) # or row = Row(('userId','accoId','rating'))
dataRDD = dfRates.map(row).toDF()

其中conf定义为shrink-to-fit

我需要将此数据作为DataFrame,所以我尝试了,

dataRDD = sqlContext.createDataFrame(dfRates,['userId','accoId','rating'])

SELECT 
    ID AS NON_MAX_VALUES, (SELECT MAX(ID) FROM TABLE ) AS MAX_VALUE
FROM 
    TABLE
GROUP BY 
    ID 
HAVING 
    COUNT(*)>1
    AND
    ID NOT IN (SELECT MAX(ID) FROM TABLE)

但它不会将数据转换为DataFrame。有没有办法将其转换为DataFrame?

2 个答案:

答案 0 :(得分:1)

只要使用Spark SQL类型表示类型,就没有理由不能。这里唯一的问题似乎是你的代码。

$http.post("/api/productCategory/", { pcate: obj }).success(function (data) { 返回对的RDD(长度等于2的元组)。在这个特定的上下文中,它看起来你会在Python中得到newAPIHadoopRDD,显然无法解压缩到(int, str)

根据您已链接的文档['userId','accoId','rating']表示为JSON字符串,可以使用标准Python utils(com.google.gson.JsonObject模块)在Python端解析:

json

或使用def parse(v, fields=["userId", "accoId", "rating"]): row = Row(*fields) try: parsed = json.loads(v) except json.JSONDecodeError: parsed = {} return row(*[parsed.get(x) for x in fields]) dfRates.map(parse).toDF() 在Scala / DataFrame方面:

get_json_object

请注意我用于定义和创建行的语法的差异。

答案 1 :(得分:0)

hbase表行:

hbase(main):008:0> scan 'test_hbase_table'
ROW                                            COLUMN+CELL
 dalin                                         column=cf:age, timestamp=1464101679601, value=40
 tangtang                                      column=cf:age, timestamp=1464101649704, value=9
 tangtang                                      column=cf:name, timestamp=1464108263191, value=zitang
2 row(s) in 0.0170 seconds

我们走了

import json
host = '172.23.18.139'
table = 'test_hbase_table'
conf = {"hbase.zookeeper.quorum": host, "zookeeper.znode.parent": "/hbase-unsecure", "hbase.mapreduce.inputtable": table}
keyConv = "org.apache.spark.examples.pythonconverters.ImmutableBytesWritableToStringConverter"
valueConv = "org.apache.spark.examples.pythonconverters.HBaseResultToStringConverter"
hbase_rdd = sc.newAPIHadoopRDD(
        "org.apache.hadoop.hbase.mapreduce.TableInputFormat",
        "org.apache.hadoop.hbase.io.ImmutableBytesWritable",
        "org.apache.hadoop.hbase.client.Result",
        keyConverter=keyConv,
        valueConverter=valueConv,
        conf=conf)
hbase_rdd1 = hbase_rdd.flatMapValues(lambda v: v.split("\n"))

在这里我们得到了结果

tt=sqlContext.jsonRDD(hbase_rdd1.values())
In [113]: tt.show()
+------------+---------+--------+-------------+----+------+
|columnFamily|qualifier|     row|    timestamp|type| value|
+------------+---------+--------+-------------+----+------+
|          cf|      age|   dalin|1464101679601| Put|    40|
|          cf|      age|tangtang|1464101649704| Put|     9|
|          cf|     name|tangtang|1464108263191| Put|zitang|
+------------+---------+--------+-------------+----+------+