Apache spark 分区中的spark模式差异

Apache spark 分区中的spark模式差异,apache-spark,pyspark,Apache Spark,Pyspark,我必须从按区域划分的路径读取数据 美国地区有a、b、c、d、e列 欧元区只有a、b、c、d 当我从路径读取数据并执行printSchema时,我只看到缺少a、b、c、d'e 有没有办法处理这种情况?与列e一样,EUR数据会自动填充null…?一旦从路径读取数据,就可以检查数据框是否包含列“e”。如果没有,那么您可以将其添加为默认值,在这种情况下,默认值为None from pyspark.sql import SparkSession from pyspark.sql.funct

我必须从按区域划分的路径读取数据

美国地区有a、b、c、d、e列 欧元区只有a、b、c、d

当我从路径读取数据并执行printSchema时,我只看到缺少a、b、c、d'e


有没有办法处理这种情况?与列e一样,EUR数据会自动填充null…?

一旦从路径读取数据,就可以检查数据框是否包含列“e”。如果没有,那么您可以将其添加为默认值,在这种情况下,默认值为None

    from pyspark.sql import SparkSession
    from pyspark.sql.functions import lit

    spark = SparkSession.builder \
                        .appName('example') \
                        .getOrCreate()
    df = spark.createDataFrame(data=data, schema = columns)
    if 'e' not in df.columns:
        df = df.withColumn('e',lit(None))

您可以从两个数据集中收集所有可能的列,如果该列在每个数据集中都不可用,则可以不填充任何列

df_ab=(火花)
.sparkContext
.并行化([
('a1','b1'),
('a2','b2'),
])
.toDF(['a','b']))
)
df_ab.show()
# +---+---+
#| a | b|
# +---+---+
#| a1 | b1|
#| a2 | b2|
# +---+---+
df_abcd=(火花)
.sparkContext
.并行化([
(‘a3’、‘b3’、‘c3’、‘d3’),
(‘a4’、‘b4’、‘c4’、‘d4’),
])
.toDF(['a','b','c','d'])
)
df_abcd.show()
# +---+---+---+---+
#| a | b | c | d|
# +---+---+---+---+
#| a3 | b3 | c3 | d3|
#| a4 | b4 | c4 | d4|
# +---+---+---+---+
唯一列=列表(设置(df_ab.columns+df_abcd.columns))
#['d','b','a','c']
对于唯一_列中的列:
如果列不在df_ab.列中:
df_ab=带列的df_ab.(列,F.lit(无))
如果列不在df_abcd.列中:
df_abcd=df_abcd.带列(列,F.lit(无))
df_ab.printSchema()
#根
#|--a:string(nullable=true)
#|--b:string(nullable=true)
#|--d:null(nullable=true)
#|--c:null(nullable=true)
df_ab.show()
# +---+---+----+----+
#| a | b | d | c|
# +---+---+----+----+
#| a1 | b1 |空|空|
#| a2 | b2 |空|空|
# +---+---+----+----+
df_abcd.printSchema()
#根
#|--a:string(nullable=true)
#|--b:string(nullable=true)
#|--c:字符串(nullable=true)
#|--d:string(nullable=true)
df_abcd.show()
# +---+---+---+---+
#| a | b | c | d|
# +---+---+---+---+
#| a3 | b3 | c3 | d3|
#| a4 | b4 | c4 | d4|
# +---+---+---+---+

我使用了pyspark和SQLContext。希望此实现将帮助您获得想法。Spark提供了一个使用SQL的环境,对于这类事情使用Spark SQL非常方便

from pyspark import SparkContext
from pyspark.sql import SparkSession
from pyspark.sql import Row
from pyspark.sql import functions
from pyspark.sql import SQLContext
import sys
import os        
from pyspark.sql.types import StructType,StructField, StringType, IntegerType

class getData(object):
"""docstring for getData"""

  def __init__(self):
  def get_data(self, n):
    
    spark = SparkSession.builder.appName('YourProjectName').getOrCreate()

    data2 = [("region 1","region 2","region 3","region 4"),
            ("region 5","region 6","region 7","region 8")
            
            ]

    schema = StructType([ \
                StructField("a",StringType(),True), \
                StructField("b",StringType(),True), \
                StructField("c",StringType(),True), \
                StructField("d", StringType(), True) \
                
                ])

    data3 = [("EU region 1","EU region 2","EU region 3"),
            ("EU region 5","EU region 6","EU region 7")
            
            ]

    schema3 = StructType([ \
                StructField("a",StringType(),True), \
                StructField("b",StringType(),True), \
                StructField("c",StringType(),True) \
                
                
                ])

    df = spark.createDataFrame(data=data2,schema=schema)
    df.createOrReplaceTempView("USRegion")
    sqlDF = self.sparkSession1.sql("SELECT * FROM USRegion")
    sqlDF.show(n=600)

    df1 = spark.createDataFrame(data=data3,schema=schema3)
    df1.createOrReplaceTempView("EURegion")
    sqlDF1 = self.sparkSession1.sql("SELECT * FROM EURegion")
    sqlDF1.show(n=600)
    

    sql_union_df = self.sparkSession1.sql("SELECT a, b, c, d FROM USRegion  uNION ALL SELECT a,b, c, '' as d FROM EURegion ")
    sql_union_df.show(n=600)


#call the class
conn = getData()
#call the method implemented inside the class
print(conn.get_data(10))

需要更多信息。您的数据格式是什么?我使用pyspark添加了一个答案。请查看答案,如果您需要任何支持或增强,请与我联系,谢谢:)嗨,Kapil,美国总共有1200个专栏,欧元只有140个专栏。因此,我无法通过代码手动添加每一列。列“e”也有我们的值。在上面的代码段u共享中,e是硬编码的,没有…您可以添加一些代码和数据的详细信息吗。这将有助于复制这个问题,并提供一些帮助。如果您在这方面需要更多支持,请告诉我。我很乐意帮忙:)