Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 处理Pyspark/Hive中不断变化的数据类型_Python_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

Python 处理Pyspark/Hive中不断变化的数据类型

Python 处理Pyspark/Hive中不断变化的数据类型,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,我在分析pyspark中不一致的数据类型时遇到问题。如下面的示例文件所示,SA键始终包含一个字典,但有时它可以显示为字符串值。当我试图获取列SA.SM.Name时,我得到如下所示的异常 如何在pyspark/hive中为除JSON以外的值的SA.SM.Name列设置null。有人能帮我吗 我尝试转换到不同的数据类型,但没有任何效果,或者可能是我做错了什么 输入文件内容:mypath {“id”:1,“SA”:{“SM”:{“Name”:“John”,“Email”:”John@example.c

我在分析pyspark中不一致的数据类型时遇到问题。如下面的示例文件所示,SA键始终包含一个字典,但有时它可以显示为字符串值。当我试图获取列SA.SM.Name时,我得到如下所示的异常

如何在pyspark/hive中为除JSON以外的值的SA.SM.Name列设置null。有人能帮我吗

我尝试转换到不同的数据类型,但没有任何效果,或者可能是我做错了什么

输入文件内容: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”}

回溯(最近一次调用):文件“”,第1行,在 文件“/usr/lib/spark/python/pyspark/sql/session.py”,第行 767,在sql中 返回数据帧(self.\u jsparkSession.sql(sqlQuery),self.\u包装)文件 “/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py”, 第1257行,在调用文件中 “/usr/lib/spark/python/pyspark/sql/utils.py”,第69行,deco格式 raise AnalysisException(s.split(“:”,1)[1],stackTrace)pyspark.sql.utils.AnalysisException:“无法从中提取值。” SA#6.SM:需要结构类型,但得到字符串;第1行位置10“


使用dataframes是不可能的,因为spark加载列SA时,它被读取为字符串。但是您可以使用sparkContext作为rdd加载文件/表,然后使用cleaner函数将空dict值映射到SA。在这里,我将该文件作为textFile加载,但如果它是hadoopfile,则执行必要的实现

def cleaner(record):
    output = ""
    print(type(record))
    try:
        output = json.loads(record)
    except Exception as e:
        print("exception happened")
    finally:
        if isinstance(output.get("SA"), str ):
            print("This is string")
            output["SA"] = {}
    return output

dfx = spark.sparkContext.textFile("file://"+my_path)

dfx2 = dfx.map(cleaner)

new_df = spark.createDataFrame(dfx2)
new_df.show(truncate=False)
+---------------------------------------------------+---+
|SA                                                 |id |
+---------------------------------------------------+---+
|[SM -> [Email -> John@example.com, Name -> John]]  |1  |
|[SM -> [Email -> Jerry@example.com, Name -> Jerry]]|2  |
|[]                                                 |3  |
+---------------------------------------------------+---+

new_df.printSchema()
root
 |-- SA: map (nullable = true)
 |    |-- key: string
 |    |-- value: map (valueContainsNull = true)
 |    |    |-- key: string
 |    |    |-- value: string (valueContainsNull = true)
 |-- id: long (nullable = true)



注意:如果name的输出值必须写入同一个表/列,则此解决方案可能无法工作,如果您尝试将加载的数据帧写回同一个表,然后,它将导致SA列中断,您将根据qn评论中提供的模式获得姓名和电子邮件列表。

您可以在问题处发布您的df的shcema吗?print(df.schema),如果您的SA是字符串类型,那么您有write函数来转换为映射类型>>>df.schema StructType(List(StructField(SA,StructType(List(StructField(SM,StringType,true))),true),StructField(id,LongType,true))@e.zy:您能帮助转换为映射类型吗?谢谢verymuch@HArdRese7。筛选记录解决了我的问题,至少忽略了非字符串类型的记录。
def cleaner(record):
    output = ""
    print(type(record))
    try:
        output = json.loads(record)
    except Exception as e:
        print("exception happened")
    finally:
        if isinstance(output.get("SA"), str ):
            print("This is string")
            output["SA"] = {}
    return output

dfx = spark.sparkContext.textFile("file://"+my_path)

dfx2 = dfx.map(cleaner)

new_df = spark.createDataFrame(dfx2)
new_df.show(truncate=False)
+---------------------------------------------------+---+
|SA                                                 |id |
+---------------------------------------------------+---+
|[SM -> [Email -> John@example.com, Name -> John]]  |1  |
|[SM -> [Email -> Jerry@example.com, Name -> Jerry]]|2  |
|[]                                                 |3  |
+---------------------------------------------------+---+

new_df.printSchema()
root
 |-- SA: map (nullable = true)
 |    |-- key: string
 |    |-- value: map (valueContainsNull = true)
 |    |    |-- key: string
 |    |    |-- value: string (valueContainsNull = true)
 |-- id: long (nullable = true)