代码之家  ›  专栏  ›  技术社区  ›  Data_101

为每个文件创建包含架构数据的数据帧

  •  1
  • Data_101  · 技术社区  · 6 年前

    我正在尝试创建一个数据帧,然后运行一个for循环来查看一堆文件。在每个文件中运行,并将一行添加到文件的数据帧中。包含文件名和架构详细信息?

    # Schema    
    schema = StructType([
        StructField("filename", StringType(), True),
        StructField("converteddate", StringType(), True),
        StructField("eventdate", StringType(), True)
    ])
    
    
    # Create empty dataframe
    df = spark.createDataFrame(sc.emptyRDD(), schema)
    
    
    for files in mvv_list:
        loadName = files
        videoData = spark.read\
                         .format('parquet')\
                         .options(header='true', inferSchema='true')\
                         .load(loadName)
        dataTypeList = videoData.dtypes
        two = dataTypeList[:2]
        print(loadName)
        print(two)
    
    #mnt/master-video/year=2018/month=03/day=24/part-00004-tid-28948428924977-e0fc2-c85b-4296-8a05-94c5af6-2427-c000.snappy.parquet
    #[('converteddate', 'timestamp'), ('eventdate', 'timestamp')]
    
    #mnt/master-video/year=2017/month=05/day=12/part-00004-tid-2894842977-e0f21c2-c85b-4296-8a05-94c5af6-2427-c000.snappy.parquet
    #[('converteddate', 'timestamp'), ('eventdate', 'date')]
    
    #mnt/master-video/year=2016/month=03/day=24/part-00004-tid-2884924977-e0f2512-c8b-4296-8a05-945a6-2427-c000.snappy.parquet
    #[('converteddate', 'timestamp'), ('eventdate', 'string')]
    

    我正在努力创建一行并将其附加到数据帧。

    需要的输出

    +-----------------------------+-----------------+---------------------+
    |filename                     |converteddate    |eventdate            |
    +-----------------------------+-----------------+---------------------+
    |mnt/master-video/year=2018...|timestamp        |timestamp            |
    |mnt/master-video/year=2017...|timestamp        |date                 |
    |mnt/master-video/year=2016...|timestamp        |string               |
    +-----------------------------+-----------------+---------------------+
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   pault Tanjin    6 年前

    一种方法是将所需的数据构建为列表,然后在之后创建数据帧(而不是尝试附加行)

    data = []
    for files in mvv_list:
        loadName = files
        videoData = spark.read\
                         .format('parquet')\
                         .options(header='true', inferSchema='true')\
                         .load(loadName)
        dataTypeDict = dict(videoData.dtypes)
        data.append((loadName, dataTypeDict['converteddate'], dataTypeDict['eventdate']))
    
    schema = StructType([
        StructField("filename", StringType(), True),
        StructField("converteddate", StringType(), True),
        StructField("eventdate", StringType(), True)
    ])
    
    df = spark.createDataFrame(data, schema)