【问题标题】:How to get dataFrame array value in a empty python array如何在空的python数组中获取dataFrame数组值
【发布时间】:2019-03-31 03:55:45
【问题描述】:

我正在使用 databricks 数据框(pyspark)

我有一个数据框,其中包含一个带有字符串值的数组。

我需要使用 df 值与我拥有的 python 数组中的值进行组合。

我想要的是将 df 值像这样放在 python 数组中:

listArray = []

listArray.append(dataframeArrayValue)

print(listArray)
outPut:
     [value1, value2, value3]

我得到的问题是它有点工作,但由于某种原因,我无法使用添加到新数组列表 (listArray) 的字符串值。

我的概念是我要构建一个 url,我需要使用 SQL 来获取该 url 的开始信息。第一部分是我放入 df 数组的内容。对于 url 的最后一部分,我将其存储在 python 数组中。

我想遍历两个数组,并将结果放入一个空数组中。

类似这样的:

display(dfList)
outPut:
      [dfValue1, dafValue2, dfValue3]

print(pyList)
      [pyValue1, pyValue2, pyValue3]

Whant to put them together like this:

dfValue1 + pyValue2 etc..

And getting a array like this:

newArrayContainingBoth = []

-- loop with append

结果:

print(newArrayContainingBoth)
outPut:
[dfValue1+pyValue1, dfValue2+pyValue2, dfValue3+pyValue]

希望我的问题足够清楚

【问题讨论】:

  • 你是如何循环播放的?
  • 你试过了吗? newArrayContainingBoth = dfList + pyList
  • 我还没有制作循环喷气机。一个问题是,从 df 看,它看起来像这样:[value1,value2],但是当我尝试获取第一个元素 dfList[0] 时,我得到 [value1,value2]。我不知道为什么会这样,因为太荒谬了,应该只得到我[value1]。抱歉英语不好
  • 请注意,您确定吗? df = [value1, value2] 你能展示一些样本值df吗?另外,如果你执行 python_list = df.collect(),你所拥有的只是 python_list 中的列表。

标签: python arrays dataframe pyspark


【解决方案1】:

试试这个步骤,

  • 您可以使用explode() 从该array 中获取string。那么,
  • collect() 作为list,
  • Row 中提取string 部分,
  • split() 使用逗号(“,”)。
  • 最后,使用它

首先导入explode()

from pyspark.sql.functions import explode 

假设您在 DataFrame "df" 中的上下文

columns = ['nameOffjdbc', 'some_column']
rows = [
        (['/file/path.something1'], 'value1'),
        (['/file/path.something2'], 'value2')
        ]

df = spark.createDataFrame(rows, columns)
df.show(2, False)
+-----------------------+-----------+
|nameOffjdbc            |some_column|
+-----------------------+-----------+
|[/file/path.something1]|value1     |
|[/file/path.something2]|value2     |
+-----------------------+-----------+

从 DataFrame 'df' 中选择列 nameOffjdbc

dfArray = df.select('nameOffjdbc')
print(dfArray)
DataFrame[nameOffjdbc: array<string>]

爆列nameOffjdbc

dfArray = dfArray.withColumn('nameOffjdbc', explode('nameOffjdbc'))
dfArray.show(2, False)
+---------------------+
|nameOffjdbc          |
+---------------------+
|/file/path.something1| 
|/file/path.something2|
+---------------------+

现在将它收集到 newDfArray(这是您需要的 python 列表)。

newDfArray = dfArray.collect()
print(newDfArray)
[Row(nameOffjdbc=u'/file/path.something1'), 
     Row(nameOffjdbc=u'/file/path.something2')]

因为它是(将是)格式为[Row(column)=u'value']。我们需要获取其中的value (string) 部分。因此,

pyList = ",".join(str('{0}'.format(value.nameOffjdbc)) for value in newDfArray)
print(pyList, type(pyList))
('/file/path.something1,/file/path.something2', <type 'str'>)

用逗号“,”分割值,这将在string 中创建一个list

pyList = pyList.split(',')
print(pyList, type(pyList))
(['/file/path.something1', '/file/path.something2'], <type 'list'>)

使用它

print(pyList[0])
/file/path.something1

print(pyList[1])
/file/path.something2

如果你想循环

for items in pyList:
    print(items)
/file/path.something1
/file/path.something2

简而言之,您只需要以下代码。

columns = ['nameOffjdbc', 'some_column']
rows = [
    (['/file/path.something1'], 'value1'),
    (['/file/path.something2'], 'value2')
    ]
df = spark.createDataFrame(rows, columns)

dfArray = df.select('nameOffjdbc')

dfArray = dfArray.withColumn('nameOffjdbc', explode('nameOffjdbc')).collect()
pyList = ",".join(str('{0}'.format(value.nameOffjdbc)) for value in dfArray).split(',')

注意:collect() 总是将 DataFrame 值收集到一个列表中。

更多信息,请参考:

【讨论】:

  • 谢谢!效果很好!唯一的问题是当我进入“使用它”步骤时,我的打印看起来像这样: print(pyList[0]) [u'/file/path.something1' 你知道为什么吗?或者,如果它看起来像那样无关紧要?
  • 我不希望 [ u 和 ' 成为我字符串的一部分
  • 更新:我用 .replace() 修复了这个问题
  • 你需要遵循每一步,然后使用它。
猜你喜欢
  • 2017-10-04
  • 2019-06-28
  • 2021-01-10
  • 2021-11-14
  • 2014-10-03
  • 1970-01-01
  • 2022-01-19
  • 2013-03-17
  • 1970-01-01
相关资源
最近更新 更多