Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.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 正在尝试使用JSON结构将Pyspark中的时间容器转换为分钟和小时数组_Python_Json_Pyspark - Fatal编程技术网

Python 正在尝试使用JSON结构将Pyspark中的时间容器转换为分钟和小时数组

Python 正在尝试使用JSON结构将Pyspark中的时间容器转换为分钟和小时数组,python,json,pyspark,Python,Json,Pyspark,我的数据的格式是 身份证件 字段2 第3场 日期 一团 1. 一些数据 一些数据 11/1/2020 {“名称”:“abc1”,“使用计数”:{“bin102”:1,“bin103”:1,“bin104”:1,“bin105”:1,“bin110”:1,“bin112”:1,“bin120”:1,“bin123”:1,“bin124”:1,“bin136”:2,“bin137”:1,“bin138”:1,“bin139”:1,“bin140”:1,“bin141”:2,“bin142”:2

我的数据的格式是


身份证件
字段2
第3场
日期
一团
1.
一些数据
一些数据
11/1/2020 
{“名称”:“abc1”,“使用计数”:{“bin102”:1,“bin103”:1,“bin104”:1,“bin105”:1,“bin110”:1,“bin112”:1,“bin120”:1,“bin123”:1,“bin124”:1,“bin136”:2,“bin137”:1,“bin138”:1,“bin139”:1,“bin140”:1,“bin141”:2,“bin142”:2},“使用最小值”:{“bin102”:7.7,“bin103”:10,“bin104”:10,“bin105”:2.5,“bin110”:0.1,“bin112”:0.8,“bin120”:6.8,“bin121”:10,“bin122”:10,“bin123”:10,“bin124”:4.3,“bin136”:2.5,“bin137”:10,“bin138”:10,“bin139”:10,“bin140”:10,“bin141”:9.3,“bin142”:3.8},“p_名称”:“abc_1”}

对于Spark2.3.1,请使用,请参见以下内容:

第1步:使用函数检索
使用率\计数
使用率\分钟
作为StringType字段:

from pyspark.sql import functions as F
import numpy as np
import pandas as pd

j1 = """{"name": "abc1", "usage_count": {"bin102": 1, "bin103": 1, "bin104": 1, "bin105": 1, "bin110": 1, "bin112": 1, "bin120": 1, "bin121": 1, "bin122": 1, "bin123": 1, "bin124": 1, "bin136": 2, "bin137": 1, "bin138": 1, "bin139": 1, "bin140": 1, "bin141": 2, "bin142": 2}, "usage_min": {"bin102": 7.7, "bin103": 10, "bin104": 10, "bin105": 2.5, "bin110": 0.1, "bin112": 0.8, "bin120": 6.8, "bin121": 10, "bin122": 10, "bin123": 10, "bin124": 4.3, "bin136": 2.5, "bin137": 10, "bin138": 10, "bin139": 10, "bin140": 10, "bin141": 9.3, "bin142": 3.8}, "p_name": "abc_1"}"""

df = spark.createDataFrame([(j1,)],['e_data'])

cols = ["name", "p_name", "usage_count", "usage_min"]

df1 = df.select(F.json_tuple("e_data", *cols).alias(*cols))
df1.printSchema()
#root
# |-- name: string (nullable = true)
# |-- p_name: string (nullable = true)
# |-- usage_count: string (nullable = true)
# |-- usage_min: string (nullable = true)
注意:如果使用以下行加载数据,则上面的
e_data
列应该是名为
td
的列的第5个元素(
df['td'][4]
)(type=
array
):

第2步:设置pandas\u udf,我们在其中使用两个元素(对应于
索引
)检索元组列表中的所有bin条目,将其转换/映射为np.array,然后用这些索引和值填充144个元素的一维数组。接下来使用将上述一维数组拆分为24个块,并执行
np.sum(axis=1)
,将结果作为pd.Series返回,值为浮点列表

def _pandas_bin_sum(s,N):
  ret = []
  for x in map(np.array, s.str.findall(r'"bin(\d+)":([\d.]+)')):
    try:
      z = np.zeros(144)
      z[x[:,0].astype(np.int)] = x[:,1].astype(np.float)
      ret.append([ float(e) for e in np.sum(np.array_split(z,N),axis=1) ])
    except:
      ret.append(None)
  return pd.Series(ret)

pandas_bin_sum = F.pandas_udf(lambda x: _pandas_bin_sum(x,24), "array<float>")

对于Spark2.3.1,请使用,请参见以下内容:

第1步:使用函数检索
使用率\计数
使用率\分钟
作为StringType字段:

from pyspark.sql import functions as F
import numpy as np
import pandas as pd

j1 = """{"name": "abc1", "usage_count": {"bin102": 1, "bin103": 1, "bin104": 1, "bin105": 1, "bin110": 1, "bin112": 1, "bin120": 1, "bin121": 1, "bin122": 1, "bin123": 1, "bin124": 1, "bin136": 2, "bin137": 1, "bin138": 1, "bin139": 1, "bin140": 1, "bin141": 2, "bin142": 2}, "usage_min": {"bin102": 7.7, "bin103": 10, "bin104": 10, "bin105": 2.5, "bin110": 0.1, "bin112": 0.8, "bin120": 6.8, "bin121": 10, "bin122": 10, "bin123": 10, "bin124": 4.3, "bin136": 2.5, "bin137": 10, "bin138": 10, "bin139": 10, "bin140": 10, "bin141": 9.3, "bin142": 3.8}, "p_name": "abc_1"}"""

df = spark.createDataFrame([(j1,)],['e_data'])

cols = ["name", "p_name", "usage_count", "usage_min"]

df1 = df.select(F.json_tuple("e_data", *cols).alias(*cols))
df1.printSchema()
#root
# |-- name: string (nullable = true)
# |-- p_name: string (nullable = true)
# |-- usage_count: string (nullable = true)
# |-- usage_min: string (nullable = true)
注意:如果使用以下行加载数据,则上面的
e_data
列应该是名为
td
的列的第5个元素(
df['td'][4]
)(type=
array
):

第2步:设置pandas\u udf,我们在其中使用两个元素(对应于
索引
)检索元组列表中的所有bin条目,将其转换/映射为np.array,然后用这些索引和值填充144个元素的一维数组。接下来使用将上述一维数组拆分为24个块,并执行
np.sum(axis=1)
,将结果作为pd.Series返回,值为浮点列表

def _pandas_bin_sum(s,N):
  ret = []
  for x in map(np.array, s.str.findall(r'"bin(\d+)":([\d.]+)')):
    try:
      z = np.zeros(144)
      z[x[:,0].astype(np.int)] = x[:,1].astype(np.float)
      ret.append([ float(e) for e in np.sum(np.array_split(z,N),axis=1) ])
    except:
      ret.append(None)
  return pd.Series(ret)

pandas_bin_sum = F.pandas_udf(lambda x: _pandas_bin_sum(x,24), "array<float>")

谢谢你给我指出这个问题@jxc。然而,我正试图为Spark 2.3.1版找到一个解决方案。对于spark版本2.4+,上述问题可以回答。你知道我可以在低火花版本中使用什么等效物吗?谢谢你给我指出@jxc这个问题。然而,我正试图为Spark 2.3.1版找到一个解决方案。对于spark版本2.4+,上述问题可以回答。你知道我可以在较低版本的Spark中使用什么等效物吗?@Falconic,你介意对我的答案有任何问题进行反馈吗?@Falconic,你介意对我的答案有任何问题进行反馈吗?