我使用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?
答案 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|
+------------+---------+--------+-------------+----+------+