我有一个Cassandra表,为简单起见,看起来像:
key: text
jsonData: text
blobData: blob
我可以使用spark和spark-cassandra-connector为此创建一个基本数据框:
val df = sqlContext.read
.format("org.apache.spark.sql.cassandra")
.options(Map("table" -> "mytable", "keyspace" -> "ks1"))
.load()
我正在努力将JSON数据扩展到其底层结构中 . 我最终希望能够根据json字符串中的属性进行过滤并返回blob数据 . 像jsonData.foo =“bar”之类的东西并返回blobData . 这目前可能吗?
3 回答
Spark 2.1+
你可以使用from_json功能:
Spark 1.6+
您可以使用带有列和路径的
get_json_object
:并将字段提取到单个字符串,这些字符串可以进一步转换为预期类型 .
path
参数使用点语法表示,前导$.
表示文档根(因为上面的代码使用字符串插值$
必须进行转义,因此$$.
) .Spark <= 1.5 :
据我所知,这不是直接可能的 . 你可以尝试类似的东西:
我假设
blob
字段不能用JSON表示 . 否则你的出租车省略拆分和加入:另一种(更便宜,但更复杂)方法是使用UDF来解析JSON并输出
struct
或map
列 . 例如这样的事情:from_json
功能正是您所需要的 . 您的代码将类似于:底层JSON字符串是
下面是过滤JSON并将所需数据加载到Cassandra的脚本 .