首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我正在加载列,这是一个varchar存储JSON字符串从mysql表到Spark dataframe。我希望能够在上面使用Spark Sql

我正在加载列,这是一个varchar存储JSON字符串从mysql表到Spark dataframe。我希望能够在上面使用Spark Sql
EN

Stack Overflow用户
提问于 2020-04-29 14:01:23
回答 1查看 97关注 0票数 0

下面是我的代码

代码语言:javascript
运行
复制
    val query = """
    (select id, data as b_data from gtest) t
    """

    val df = spark.read.format("jdbc")
      .option("url", "jdbc:mysql://192.168.0.22:3306/db")
      .option("driver", "com.mysql.jdbc.Driver")
      .option("useSSL", "false")
      .option("user", "dba")
      .option("password", "pwd")
      .option("dbtable",query)
      .load()

    df.createOrReplaceTempView("tbl")

在mysql表tbl中的字段b_data是varchar类型的,并且具有如下所示的JSON (只是一个示例),它可以被嵌套,我希望能够使用这个JSON,而不必使用固定的模式,因为手动定义模式是不切实际的,因为JSON可以是大的和嵌套的。

代码语言:javascript
运行
复制
{"id" : 100, "details" : {"fn" : "sample", "ln" : "data"}}

我希望能够做到以下几点

代码语言:javascript
运行
复制
%sql
select id, b_data.id, b_data.details.fn from tbl

一些信息

代码语言:javascript
运行
复制
df.printSchema

root
 |-- id: integer (nullable = true)
 |-- b_data: string (nullable = true)
代码语言:javascript
运行
复制
spark.version

res89: String = 2.4.5

当我运行sql查询时得到的异常如下

代码语言:javascript
运行
复制
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
....
....
....

Caused by: org.apache.spark.sql.AnalysisException: Can't extract value from b_data#4270: need struct type but got string; line 1 pos 10
    at org.apache.spark.sql.catalyst.expressions.ExtractValue$.apply(complexTypeExtractors.scala:73)
......

我假设DataFrame的列类型必须从String更改为DataStruct??我在这一点上迷失了方向。

EN

Stack Overflow用户

发布于 2020-04-29 15:18:45

可能b_data的数据类型是字符串(JSON string),所以您无法对其进行查询。在创建临时视图之前,您可能需要读取json字符串。

您可以在阅读时提供自定义模式,也可以使用schema_of_json函数获取模式

代码语言:javascript
运行
复制
val schema = schema_of_json(lit(df.select($"b_data").as[String].first))
val resultDF = df.withColumn("b_data_new", from_json($"b_data", schema))

resultDF.createOrReplaceTempView("tbl")

现在您可以按如下方式查询

代码语言:javascript
运行
复制
select b_data_new.id, b_data_new.details.fn from tbl
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61495225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档