【发布时间】:2020-10-10 03:37:10
【问题描述】:
我在解析 pyspark 中不一致的数据类型时遇到问题。如下面的示例文件所示,SA 键始终包含一个字典,但有时它可以显示为字符串值。当我尝试获取 SA.SM.Name 列时,出现如下所示的异常。
如何将 pyspark/hive 中的 SA.SM.Name 列设置为空值具有 JSON 以外的值。有人可以帮帮我吗?
我尝试转换为不同的数据类型,但没有任何效果,或者我可能做错了什么。
输入文件内容:mypath
{"id":1,"SA":{"SM": {"Name":"John","Email":"John@example.com"}}}
{"id":2,"SA":{"SM": {"Name":"Jerry","Email":"Jerry@example.com"}}}
{"id":3,"SA":"STRINGVALUE"}
df=spark.read.json(my_path)
df.registerTempTable("T")
spark.sql("""select id,SA.SM.Name from T """).show()
Traceback(最近一次调用最后一次):文件“”,第 1 行,in 文件“/usr/lib/spark/python/pyspark/sql/session.py”,行 767,在sql中 返回 DataFrame(self._jsparkSession.sql(sqlQuery), self._wrapped) 文件 "/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", 第 1257 行,在 call 文件中 “/usr/lib/spark/python/pyspark/sql/utils.py”,第 69 行,在 deco raise AnalysisException(s.split(': ', 1)[1], stackTrace) pyspark.sql.utils.AnalysisException: "Can't extract value from SA#6.SM:需要结构类型但得到字符串;第 1 行 pos 10"
【问题讨论】:
-
你能在这个问题上发布你的 df 的 shcema 吗? print(df.schema),如果你的 SA 是 STRING TYPE,那么你有写函数来转换为 MAP TYPE
-
>>> df.schema StructType(List(StructField(SA,StructType(List(StructField(SM,StringType,true))),true),StructField(id,LongType,true)))
-
@e.zy : 你能帮忙看看如何转换成 MAP 类型吗?
标签: python apache-spark pyspark apache-spark-sql